边缘检测就是对采集到的图像进行处理,得到一幅显示边缘轮廓的图像,以便后续的处理与利用。
使用函数cvCanny:
void cvCanny( const CvArr* image, CvArr* edges, doublethreshold1, double threshold2, int aperture_size=3 );
image
单通道输入图像.
edges
单通道存储边缘的输出图像
threshold1
第一个阈值
threshold2
第二个阈值
aperture_size
Sobel 算子内核大小 (见 cvSobel).
函数 cvCanny 采用 CANNY 算法发现输入图像的边缘而且在输出图像中标识这些边缘。threshold1和threshold2 当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。
注意:cvCanny只接受单通道图像作为输入。
实现代码如下:
1. #include <stdio.h>
2. #include <stdlib.h>
3. #include <opencv/highgui.h>
4. #include <opencv/cv.h>
5.
6. int main()
7. {
8. IplImage* img;
9. IplImage* src;
10. IplImage* dst;
11.
12. CvCapture* cam = cvCreateCameraCapture(0);//初始化摄像头
13. cvSetCaptureProperty(cam, CV_CAP_PROP_FRAME_WIDTH, 640);//设置图像宽
14. cvSetCaptureProperty(cam, CV_CAP_PROP_FRAME_HEIGHT,480);//设置图像高
15.
16. img = cvQueryFrame(cam);//获取一帧图像
17. src = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);//用所获图像创建8位、单通道图像
18. cvConvertImage(img, src, 0);
19. dst = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);//用所获图像创建8位、单通道图像
20.
21. cvCanny(src, dst, 50, 100, 3);//边缘检测
22.
23. cvNamedWindow("Test", CV_WINDOW_AUTOSIZE);
24. cvNamedWindow("Out", CV_WINDOW_AUTOSIZE);
25.
26. cvShowImage("Test", img);//显示原图像
27. cvShowImage("Out", dst);//边缘检测后的图像
28. cvSaveImage("out.jpg", dst, 0);//保存
29. cvWaitKey(0);
30.
31. cvReleaseImage(&img);
32. cvReleaseImage(&src);
33. cvReleaseImage(&dst);
34. cvDestroyWindow("Test");
35. cvDestroyWindow("Out");
36. }
37.
cvCanny函数生成的轮廓
拉普拉斯变换生成的轮廓图