OpenCV 轮廓检测《转自雷霄骅的文章》

使用OpenCV可以对图像的轮廓进行检测。这是之前用过的代码,挺简单的,回顾一下。主要要进行以下2步操作:

1.cvThreshold():对图像进行二值化处理

2.cvFindContours():查找图像轮廓

注意:这个过程中图像要转化为灰度图。

 

  1. /*********************************************************************** 
  2.     雷霄骅 
  3.  ***********************************************************************/  
  4. #include "stdafx.h"  
  5. #include "cv.h"  
  6. #include "cxcore.h"  
  7. #include "highgui.h"  
  8.    
  9. int main( int argc, char** argv )  
  10. {  
  11.   //声明IplImage指针  
  12.   IplImage* pImg = NULL;   
  13.   IplImage* pContourImg = NULL;  
  14.    
  15.   CvMemStorage * storage = cvCreateMemStorage(0);  
  16.   CvSeq * contour = 0;  
  17.   int mode = CV_RETR_EXTERNAL;  
  18.    
  19.   if( argc == 3)  
  20.       if(strcmp(argv[2], "all") == 0)  
  21.     mode = CV_RETR_CCOMP; //内外轮廓都检测  
  22.    
  23.    
  24.   //创建窗口  
  25.   cvNamedWindow("src", 1);  
  26.   cvNamedWindow("contour",1);  
  27.   cvNamedWindow("threshold",1);  
  28.    
  29.    
  30.   //载入图像,强制转化为Gray  
  31.   if( argc >= 2 &&   
  32.       (pImg = cvLoadImage( argv[1], 0)) != 0 )  
  33.     {  
  34.    
  35.       cvShowImage( "src", pImg );  
  36.    
  37.       //为轮廓显示图像申请空间  
  38.       //3通道图像,以便用彩色显示  
  39.       pContourImg = cvCreateImage(cvGetSize(pImg),  
  40.                       IPL_DEPTH_8U,  
  41.                       3);  
  42.       //copy source image and convert it to BGR image  
  43.       cvCvtColor(pImg, pContourImg, CV_GRAY2BGR);  
  44. //----阈值分割-------------------------------------------  
  45.       cvThreshold( pImg, pImg, 150, 255, CV_THRESH_BINARY );  
  46.       cvShowImage( "threshold", pImg );  
  47. //-----------------------------------------------  
  48. //查找contour----------------输入必须是二值图像  
  49.       cvFindContours( pImg, storage, &contour, sizeof(CvContour),   
  50.           mode, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));  
  51.    
  52.     }  
  53.   else  
  54.     {  
  55.       //销毁窗口  
  56.       cvDestroyWindow( "src" );  
  57.       cvDestroyWindow( "contour" );  
  58.       cvReleaseMemStorage(&storage);  
  59.    
  60.       return -1;  
  61.     }  
  62.    
  63.   //将轮廓画出      
  64.   cvDrawContours(pContourImg, contour,   
  65.          CV_RGB(0,0,255), CV_RGB(255, 0, 0),   
  66.          2, 2, 8, cvPoint(0,0));  
  67.   //显示图像  
  68.   cvShowImage( "contour", pContourImg );  
  69.    
  70.   cvWaitKey(0);  
  71.    
  72.   //销毁窗口  
  73.   cvDestroyWindow( "src" );  
  74.   cvDestroyWindow( "contour" );  
  75.   //释放图像  
  76.   cvReleaseImage( &pImg );   
  77.   cvReleaseImage( &pContourImg );   
  78.    
  79.   cvReleaseMemStorage(&storage);  
  80.    
  81.   return 0;  
  82. }  

 

 

 

源图像:

二值化以后:

轮廓:

©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页