1 #include <highgui.h>
2 #include <cv.h>
3
4 IplImage * doCanny(IplImage * in,double lowThresh,double highThresh,double aperture) 5 { 6 if(in->nChannels !=1) 7 { 8 return 0; 9 } 10 IplImage *out =cvCreateImage(cvSize(cvGetSize(in).width,cvGetSize(in).height),IPL_DEPTH_8U,1); 11 cvCanny(in,out,lowThresh,highThresh,aperture); 12 return (out); 13
14 } 15 int main() 16 { 17 cvNamedWindow("example-in"); 18 cvNamedWindow("example-out"); 19 IplImage * in=cvLoadImage("I:\\資料\\opencv相關資料\\OpenCV教程\\圖像與視頻\\airplane.png",0); 20 cvShowImage("example-in",in); 21 IplImage * out = doCanny(in,1.0,3.0,3.0); 22 cvShowImage("example-out",out); 23
24 cvWaitKey(0);//key point
25 cvReleaseImage(&in); 26 cvReleaseImage(&out); 27 cvDestroyWindow("example-in"); 28 cvDestroyWindow("example-out"); 29
30 }
1. cvCanny:
doCanny(in,1.0,3.0,3.0);
void cvCanny( const CvArr* image,CvArr* edges,double threshold1,double threshold2, int aperture_size=3 );
image 輸入圖像,這個必須是單通道的,即灰度圖
edges 輸出的邊緣圖像 ,也是單通道的,但是是黑白的
threshold1 第一個閾值
threshold2 第二個閾值
aperture_size Sobel 算子內核大小
函數 cvCanny 采用 Canny 算法發現輸入圖像的邊緣而且在輸出圖像中標識這些邊緣。threshold1和threshold2 當中的小閾值用來控制邊緣連接,大的閾值用來控制強邊緣的初始分割。
2. 補充一點,灰度圖的生成:
cvCanny函數需要輸入圖像為灰度圖,怎樣產生一張灰度圖呢?我們可以使用cvLoadImage()載入灰度圖。具體參數設置如下說明:
cvLoadImage函數使用方法:
cvLoadImage( filename, -1 ); //默認讀取圖像的原通道數
cvLoadImage( filename, 0 ); //強制轉化讀取圖像為灰度圖
cvLoadImage( filename, 1 ); //讀取彩色圖
3. 關於cvCanny函數的一個錯誤記錄:
出現OpenCV Error:Assertion failed (src.derth()==dst.depth && src.size()==dst.size()) 錯誤,導致程序中斷!
原因如下:
錯誤含義是:原數據和目的數據的深度或者大小不同 導致不能進行賦值變換。
1.check這兩個圖或者矩陣是不是初始化了
2.如果初始化了,初始化的大小是不是一樣,即兩者有沒有相同的長寬
3.兩者的depth深度是不是一樣,即是不是一個是三通道的,一個是單通道的。或者一個是單通道32位浮點類型,一個是單通道8位整形類型。