邊緣檢測就是對采集到的圖像進行處理,得到一幅顯示邊緣輪廓的圖像,以便後續的處理與利用。
使用函數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");
}