opencv学习心得(六)新版本绘制外形轮廓

最近在研究opencv2.3.1版本函数,因为函数结构使用C++类型的,所以在一些函数调用上有很多差别,但是在运行速度上提高不少,所以还是新版本好用。其实在新版本发布是,会有相关的使用手册,很多例子会在其中找到。这个程序和例程有所不同,只绘制最外侧的轮廓,为后来的提取图像,有很大帮助。
[html]  view plain copy print ?
  1. #include <stdio.h>  
  2.   
  3. #include <cv.h>  
  4. #include <cxcore.h>  
  5. #include <highgui.h>  
  6. #include <iostream>  
  7. using namespace cv;  
  8. using namespace std;  
  9. vector<vector<Point>> contours;  
  10. vector<Vec4i> her;  
  11. int j=0;//用于随后选择哪个外形轮廓  
  12. int main()  
  13. {  
  14.     VideoCapture video;  
  15.     Mat image,frimg,bkimg,frame;  
  16.     namedWindow("video");  
  17.     //cvNamedWindow("video", 1);  
  18.     namedWindow("background",1);  
  19.     namedWindow("foreground",1);  
  20.     //使窗口有序排列  
  21.     cvMoveWindow("video", 30, 0);  
  22.     cvMoveWindow("background", 360, 0);  
  23.     cvMoveWindow("foreground", 690, 0);  
  24.     int num=0;  
  25.     video.open("E:\\自己编写的程序\\测试视频\\test3.avi");  
  26.     if (!video.isOpened())  
  27.     {  
  28.         cout<<"video open failed!"<<endl;  
  29.         return 0;  
  30.     }  
  31.     while(1)  
  32.     {  
  33.         num++;  
  34.         video>>image;  
  35.         if (num==1)  
  36.         {//开始阶段在于分配空间  
  37.             frimg.create(image.cols,image.rows,CV_32FC(1));  
  38.             //frimg(1,)  
  39.             bkimg.create(image.cols,image.rows,CV_32FC(1));  
  40.             frame.create(image.cols,image.rows,CV_32FC(1));  
  41.             cvtColor(image,frimg,CV_RGB2GRAY);  
  42.             cvtColor(image,bkimg,CV_RGB2GRAY);  
  43.         }  
  44.         else  
  45.         {   cout<<num<<endl;  
  46.             cvtColor(image,frimg,CV_RGB2GRAY);  
  47.             frimg.copyTo(frame);  
  48.             absdiff(frame,bkimg,frame);  
  49.             /// 使用Threshold二值  
  50.             threshold(frame,frimg,50,255,CV_THRESH_BINARY);  
  51.             /// 找到轮廓  
  52.             //contours参数为检测的轮廓数组,每一个轮廓用一个point类型的vector表示  
  53.             //hiararchy参数和轮廓个数相同,每个轮廓contours[ i ]对应4个hierarchy元素hierarchy[ i ][ 0 ] ~hierarchy[ i ][ 3 ],  
  54.             //分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,该值设置为负数。  
  55.             //CV_RETR_TREE:建立一个等级树结构的轮廓  
  56.             findContours(frimg,contours,her,CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE,Point(0,0));  
  57. //          / 多边形逼近轮廓 + 获取矩形和圆形边界框  
  58. //                      vector<vector<Point> > contours_poly( contours.size() );   //近似后的轮廓点集  
  59.                         vector<Rect> boundRect( contours.size() );             //包围点集的最小矩形vector  
  60. //                      vector<Point2f>center( contours.size() );            //包围点集的最小圆形vector  
  61. //                      vector<float>radius( contours.size() );                //包围点集的最小圆形半径vector  
  62. //                      for( int i = 0; i < contours.size(); i++ )  
  63. //                      {  
  64. //                          approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true );      //对多边形曲线做适当近似,contours_poly[i]是输出的近似点集  
  65. //                          boundRect[i] = boundingRect( Mat(contours_poly[i]) );         //计算并返回包围轮廓点集的最小矩形  
  66. //                          minEnclosingCircle( contours_poly[i], center[i], radius[i] );     //计算并返回包围轮廓点集的最小圆形及其半径  
  67. //                      }  
  68. //                      /// 画多边形轮廓 + 包围的矩形框 + 圆形框  
  69. //                      //Mat drawing = Mat::zeros( threshold_output.size(), CV_8UC3 );  
  70. //                      int aeras=0;  
  71. //                      for( int i = 0; i< contours.size(); i++ )  
  72. //                      {  
  73. //                          //Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );   //随机颜色  
  74. //                          //   drawContours( drawing, contours_poly, i, color, 1, 8, vector<Vec4i>(), 0, Point() );  
  75. //                          //drawContours( image, contours_poly, i, color, 1, 8, her, 0, Point() );   
  76. //                          //根据轮廓点集contours_poly和轮廓结构hierarchy画出轮廓  
  77. //                          //aeras=cvContourArea(contours);  
  78. //                          rectangle( image, boundRect[i].tl(), boundRect[i].br(), CV_RGB(255,0,5), 2, 8, 0 );              //画矩形,tl矩形左上角,br右上角  
  79. //                          circle( image, center[i], (int)radius[i], CV_RGB(255,0,5), 2, 8, 0 );                                        //画圆形  
  80. //                      }  
  81.                         //终于研究出来了,只显示一个最大框  
  82.             int idx = 0largestComp = 0;  
  83.             double maxArea = 0;double area;  
  84.             for (int i=0;i<contours.size();i++)  
  85.             {  
  86.                  area=fabs(contourArea(contours[i]));  
  87.                  if (area>maxArea)  
  88.                  {  
  89.                      maxArea=area;  
  90.                      j=i;  
  91.                  }  
  92.             }  
  93.             //只有大于100,才显示矩形框。  
  94.             if (maxArea>100)  
  95.             {  
  96.                 Rect rect=boundingRect(contours[j]);  
  97.                 rectangle( image, rect.tl(), rect.br(), CV_RGB(255,0,5), 2, 8, 0 );   
  98.   
  99.             }  
  100.   
  101.         }  
  102.           
  103.         /// 显示在一个窗口  
  104.           
  105.         imshow("video",image);  
  106.         imshow("foreground",frimg);  
  107.         imshow("background",bkimg);  
  108.         char c=waitKey(33);  
  109.         if (c==27)  
  110.         {  
  111.             break;  
  112.         }  
  113.   
  114.   
  115.     }  
  116.     return 0;  
  117.       
  118. }  
转自:http://blog.csdn.net/poiiy333/article/details/8935753

你可能感兴趣的:(openCV)