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