2.1 OpenCV图像的边缘检测

这里使用Canny函数进行边缘检测

函数定义:

void cvCanny( const CvArr* image,CvArr* edges,double threshold1,double threshold2, int aperture_size=3 );

参数说明:

image  //输入单通道图像(可以是彩色图像)对于多通道的图像可以用cvCvtColor()修改。
edges //输出的边缘图像 ,也是单通道的,但是是黑白的
threshold1 //第一个阈值
threshold2 //第二个阈值,当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。
aperture_size Sobel //算子内核大小

 

1、创建用于显示原图像和输出图像的窗口

1 cvNamedWindow("Example1", CV_WINDOW_AUTOSIZE);
2 cvNamedWindow("Example2", CV_WINDOW_AUTOSIZE);

2、读取原图像

1 IplImage* img_rgb = cvLoadImage("E:\\test.jpg");

3、创建灰度图像的文件结构

1 IplImage* img_gray = cvCreateImage(cvSize(img_rgb->width, img_rgb->height),
2             img_rgb->depth,
3             1
4          );

4、将RGB原图像转换为灰度图像

1 cvCvtColor(img_rgb, img_gray, CV_BGR2GRAY);

5、对灰度图进行边缘检测,并保存到一个图像文件

1 IplImage* img_cny = doCanny(img_gray, 90, 150, 3);

6、释放图像内存

1 cvReleaseImage(&img_rgb);
2 cvReleaseImage(&img_gray);
3 cvReleaseImage(&img_cny);

7、关闭窗口

1 cvDestroyWindow("Example1");
2 cvDestroyWindow("Example2");

完整代码:

 1 /************************************************************************/
 2 /* Canny边缘检测                                                                     */
 3 /************************************************************************/
 4 #include "cv.h"
 5 #include "highgui.h"
 6 
 7 IplImage* doCanny(
 8         IplImage* in,
 9         double lowThresh,
10         double highThresh,
11         double aperture
12     )
13 {
14     //Canny只能处理灰度图
15     if (in->nChannels != 1)
16         return 0;
17 
18     IplImage* out = cvCreateImage(
19             cvGetSize(in),
20             in->depth,
21             1
22         );
23 
24     cvCanny(in, out, lowThresh, highThresh, aperture);
25 
26     return out;
27 
28 }
29 
30 int main(int argc, char** argv)
31 {
32      cvNamedWindow("Example1", CV_WINDOW_AUTOSIZE);
33      cvNamedWindow("Example2", CV_WINDOW_AUTOSIZE);
34 
35      IplImage* img_rgb = cvLoadImage("E:\\test.jpg");
36      IplImage* img_gray = cvCreateImage(cvSize(img_rgb->width, img_rgb->height),
37             img_rgb->depth,
38             1
39          );
40 
41      cvCvtColor(img_rgb, img_gray, CV_BGR2GRAY);
42 
43      IplImage* img_cny = doCanny(img_gray, 90, 150, 3);
44 
45      cvShowImage("Example1", img_gray);
46      cvShowImage("Example2", img_cny);
47 
48      cvWaitKey(0);
49 
50      cvReleaseImage(&img_rgb);
51      cvReleaseImage(&img_gray);
52      cvReleaseImage(&img_cny);
53 
54      cvDestroyWindow("Example1");
55      cvDestroyWindow("Example2");
56 
57      return 0;
58 }

 

posted @ 2016-02-28 15:34  chan21252  阅读(556)  评论(0编辑  收藏  举报