opencv学习_9 (轮廓提取)

川长思鸟来 2022-09-18 04:47 336阅读 0赞

轮廓提取——主要针对二值图像

<1> 轮廓分为外轮廓和内轮廓 如下图:外轮廓以c开头 内轮廓以h开头

SouthEast

<2> opencv 提供了寻找轮廓的函数 inttotals = cvFindContours(img, storage,&contours,sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_NONE,cvPoint(0,0));

其中img是二值图像, storage是内存存储序列, contours指向存储的第一个轮廓,

CvMemStorage *storage =cvCreateMemStorage(0); //内存存储序列

CvSeq *contours = 0; //指向storage中的序列

CV_RETR_LIST表明轮廓在内存中的排列方式,有以下四种:

轮廓的排列方式<在内存中>

CV_RETR_EXTERNAL:first = c0

CV_RETR_CCOMP:从里到外 从右到左 这是一个双向链表

SouthEast 1

CV_RETR_LIST:

first = c01001 <–> c01000 <–>h0100 <–> h0000 <–> h0100 <–> h0000 <–> c010 <–>c000 <–> h01 <–> h00 <–> c0 这也是双向链表

CV_RETR_TREE :

SouthEast 2

<3>案例

结果展示:

SouthEast 3

代码:

  1. #include <iostream>
  2. #include "cv.h"
  3. #include "cxcore.h"
  4. #include "highgui.h"
  5. using namespace std;
  6. int main()
  7. {
  8. CvMemStorage *storage = cvCreateMemStorage(0); // 内存存储序列
  9. IplImage *img = cvLoadImage("E:\\study_opencv_video\\lesson14_1\\Debug\\55.png", 0);
  10. IplImage *imgColor = cvCreateImage(cvGetSize(img), 8, 3);
  11. IplImage *contoursImage = cvCreateImage(cvGetSize(img), 8, 1);
  12. CvSeq *contours = 0, *contoursTemp = 0;
  13. cvZero(contoursImage);
  14. cvThreshold(img, img, 100, 255, CV_THRESH_BINARY); // 二值化操作
  15. cvCvtColor(img, imgColor, CV_GRAY2BGR);
  16. int totals = cvFindContours(img, storage,&contours, sizeof(CvContour), //img必须是一个二值图像 storage 用来存储的contours指向存储的第一个轮廓
  17. CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE, cvPoint(0,0));
  18. contoursTemp = contours;
  19. int count = 0;
  20. int i;
  21. for(;contoursTemp != 0; contoursTemp = contoursTemp -> h_next) /// 这样可以访问每一个轮廓 ====横向轮廓
  22. {
  23. for(i = 0; i < contoursTemp -> total; i++) // 提取一个轮廓的所有坐标点
  24. {
  25. CvPoint *pt = (CvPoint*) cvGetSeqElem(contoursTemp, i); // 得到一个轮廓中一个点的函数cvGetSeqElem
  26. cvSetReal2D(contoursImage, pt->y, pt->x, 255.0);
  27. cvSet2D(imgColor, pt->y, pt->x, cvScalar(0,0,255,0));
  28. }
  29. count ++;
  30. CvSeq *InterCon = contoursTemp->v_next; // 访问每个轮廓的纵向轮廓
  31. for(; InterCon != 0; InterCon = InterCon ->h_next)
  32. {
  33. for(i = 0; i < InterCon->total; i++ )
  34. {
  35. CvPoint *pt = (CvPoint*)cvGetSeqElem(InterCon, i);
  36. cvSetReal2D(contoursImage, pt->y, pt->x, 255.0);
  37. cvSet2D(imgColor, pt->y, pt->x, cvScalar(0, 255, 0, 0));
  38. }
  39. }
  40. }
  41. cvNamedWindow("contoursImage");
  42. cvShowImage("contoursImage", contoursImage);
  43. cvNamedWindow("imgColor");
  44. cvShowImage("imgColor",imgColor);
  45. cvWaitKey(0);
  46. cvReleaseMemStorage(&storage); // 也要释放内存序列空间
  47. cvReleaseImage(&contoursImage);
  48. cvReleaseImage(&imgColor);
  49. cvDestroyWindow("contoursImage");
  50. cvDestroyWindow("imgColor");
  51. return 0;}
  52. 作者:小村长 出处:http://blog.csdn.net/lu597203933 欢迎转载或分享,但请务必声明文章出处。 (新浪微博:小村长zack, 欢迎交流!)

发表评论

表情:
评论列表 (有 0 条评论,336人围观)

还没有评论,来说两句吧...

相关阅读