天天看點

四.使用OpenCv采集圖像及圖像邊緣檢測

邊緣檢測就是對采集到的圖像進行處理,得到一幅顯示邊緣輪廓的圖像,以便後續的處理與利用。

使用函數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");
}