OpenCV 实现canny边缘检测

近期,整理了一些之前做过的图像处理内容,算是复习下基础吧;

涉及canny边缘检测的OpenCV实现;

图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波。Canny是常用的边缘检测方法,其特点是试图将独立边的候选像素拼装成轮廓。

canny边缘检测算子是一种多级检测算法。1986年由John F. Canny提出,同时提出了边缘检测的三大准则:

  1. 低错误率的边缘检测:检测算法应该精确地找到图像中的尽可能多的边缘,尽可能的减少漏检和误检。
  2. 最优定位:检测的边缘点应该精确地定位于边缘的中心。
  3. 图像中的任意边缘应该只被标记一次,同时图像噪声不应产生伪边缘.

Canny算子求边缘点具体算法步骤如下:

1. 用高斯滤波器平滑图像.

2. 用一阶偏导有限差分计算梯度幅值和方向.

3. 对梯度幅值进行非极大值抑制 .

4. 用双阈值算法检测和连接边缘


对新手来说,OpenCV的开发环境配置是第一步,建议按照mac平台下Opencv开发环境设置进行配置,对新手很友好;

不多说;上代码。

// #include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; IplImage* doCanny(IplImage* image_input, double lowThresh, double highThresh, double aperture) { if(image_input->nChannels != 1) return(0); IplImage* image_output = cvCreateImage(cvGetSize(image_input), image_input->depth, image_input->nChannels); cvCanny(image_input, image_output, lowThresh, highThresh, aperture);//canny边缘检测,aperture为所用sobel算子内核大小 return(image_output); } int main(int argc, const char * argv[]) { // insert code here... cvNamedWindow("macCamera",CV_WINDOW_AUTOSIZE); CvCapture *capture = cvCreateCameraCapture(CV_CAP_ANY);//创建CvCapture结构的指针,作为cvQueryFrame的输入 assert(capture != NULL);//assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先打印一条出错信息,然后通过调用 abort 来终止程序运行 IplImage *frame =0; //初始化指向IplImage结构的指针 frame frame = cvQueryFrame(capture); //从摄像头读取每一帧 IplImage *frame_edge =cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1);//定义的边缘检测后的frame_edge,8位无符号整数灰度图 while(1) { frame = cvQueryFrame(capture); if(!frame) break; // cvShowImage("macCamera", frame); cvConvertImage(frame, frame_edge,0); frame =cvCloneImage(frame_edge); frame_edge = doCanny(frame_edge, 50, 110, 3); cvShowImage("macCamera", frame_edge); std::cout << "Canny success!\n"; char c =cvWaitKey(30); if(c == 27) break; } cvReleaseCapture(&capture); cvReleaseImage(&frame_edge); cvReleaseImage(&frame); return (int)0; } 

OpenCV直接调用的摄像头,贴出自己的结果图。


《OpenCV 实现canny边缘检测》


点赞