opencv關於cvcanny函數 [7]


 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位整形類型。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM