• Open Source Computer Vision Library

轮廓(contour)检测

Wikipedia,自由的百科全书

来自于仕琪的讲稿《使用OpenCV进行图像处理》中的例程

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

Python版本

  1.  
  2. # -*- coding:utf-8 -*-
  3. ###########################################################
  4. # OpenCV example
  5. #
  6. # 轮廓检测
  7. #
  8. # 主要函数:cvFindContours, cvDrawContours
  9. #
  10. # By ChaiShushan 2008
  11. ###########################################################
  12.  
  13. import sys
  14.  
  15. # 导入OpenCV模块
  16.  
  17. from opencv.cv import *
  18. from opencv.highgui import *
  19.  
  20. if __name__ == '__main__':
  21.  
  22. # 声明IplImage指针
  23.  
  24. pImg = None;
  25. pContourImg = None;
  26.  
  27. storage = cvCreateMemStorage(0);
  28. contour = None;
  29. mode = CV_RETR_EXTERNAL;
  30.  
  31. if len(sys.argv) == 3 and sys.argv[2] == "all":
  32. mode = CV_RETR_CCOMP
  33.  
  34. # 创建窗口
  35.  
  36. cvNamedWindow("src", 1)
  37. cvNamedWindow("contour",1)
  38.  
  39. # 载入图像,强制转化为Gray
  40.  
  41. if len(sys.argv) >= 2:
  42.  
  43. pImg = cvLoadImage(sys.argv[1], 0)
  44. if not pImg: sys.exit(-1)
  45.  
  46. cvShowImage( "src", pImg );
  47.  
  48. # 为轮廓显示图像申请空间
  49. # 3通道图像,以便用彩色显示
  50.  
  51. pContourImg = cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,3);
  52.  
  53. # copy source image and convert it to BGR image
  54.  
  55. cvCvtColor(pImg, pContourImg, CV_GRAY2BGR);
  56.  
  57. # 查找contour
  58.  
  59. n, contour = cvFindContours( pImg, storage, sizeof_CvContour,
  60. mode, CV_CHAIN_APPROX_SIMPLE);
  61.  
  62. else:
  63.  
  64. # 销毁窗口
  65.  
  66. cvDestroyWindow( "src" );
  67. cvDestroyWindow( "contour" );
  68. cvReleaseMemStorage(storage);
  69. sys.exit(-1)
  70.  
  71. # 将轮廓画出
  72.  
  73. cvDrawContours(pContourImg, contour, CV_RGB(255,0,0), CV_RGB(0, 0, 255),
  74. 2, 2, 8);
  75.  
  76. # 显示图像
  77.  
  78. cvShowImage( "contour", pContourImg );
  79. cvWaitKey(0);
  80.  
  81. # 销毁窗口
  82.  
  83. cvDestroyWindow( "src" );
  84. cvDestroyWindow( "contour" );
  85.  
  86. # 释放图像
  87.  
  88. cvReleaseImage( pImg );
  89. cvReleaseImage( pContourImg );
  90.  
  91. cvReleaseMemStorage(storage);
  92.  
  93. sys.exit(0)
  94.  
注: Python版本由chai2010改写.
Views
Personal tools