opencv2.4.9 关于findcontours的一些程序

void thresh_callback(int, void*)  //只是一个回调函数
{  
    Mat src_copy = src.clone();  
    Mat threshold_output;  
    vector<vector<Point> > contours;  
    vector<Vec4i> hierarchy;  
    Point p;
    int s;
    /// 寻找轮廓  
    findContours(threshold_output, contours, hierarchy, RETR_LIST, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));  //注意第四个参数
    /*Mat drawing = Mat::zeros(threshold_output.size(), CV_8UC3);*/  
     cout<<"轮廓的个数是: "<<contours.size()<<endl;

for(unsigned int i=0;i<contours.size();i++)
{
double ContourLength = arcLength(contours[i], true); 
double Contourarea = fabs(contourArea(contours[i])); 
s=contours[i].size();//第一个轮廓的大小


if(ContourLength>50&&s>20)//?要删除小轮廓——长度点数小于设定值
{  
            //符合留下的条件。  
         numlongCon = numlongCon+1;  
cout<<"第"<<i<<"个轮廓的点个数是: "<<s;
cout<<"第"<<i<<"个轮廓的ContourLength是: "<<ContourLength;
cout<<"第"<<i<<"个轮廓的Contourarea是: "<<Contourarea<<endl;  //只是为了看一下留下的轮廓
 
        }else  
        {  
           numshortcon=numshortcon+1;
           contours.erase(contours.begin() + i);//删除短轮廓  
        }  
}
 cout<<"short轮廓的个数是: "<<numshortcon<<endl; 
 cout<<"long轮廓的个数是: "<<numlongCon<<endl;//short+long!=contour.size   ?????
/* 输出某个轮廓的所有坐标
s=contours[41].size();//第一个轮廓的大小
     if( s>0)
 {
cout<<"第41个轮廓的点个数是:  "<<s<<endl;
for(unsigned int i=0;i<s;i++)
       {
          p = contours[41].at(i);
  x = p.x;
  y = p.y;
  cout<<setw(4)<<x<<","<<setw(4)<<y<<"  ";
       
 }


//获取j条轮廓的,输出每个轮廓的所有坐标点

/*  w=contours.size();
 cout<<w;
 //s=contours[0].size();//第一个轮廓的大小
 for(unsigned int j=0;j<w;j++)
{
//  s=contours[j].size();
        
        for(unsigned int i=0,s=contours[j].size();i<s;i++)
       { 
 cout<<"第"<<j<<"个轮廓的点个数是:  "<<s<<endl;
          p = contours[j].at(i);
          x = p.x;
          y = p.y;
          cout<<x<<","<<y<<endl;
       }
}*/ 
    /* 对每个轮廓计算其凸包*/  
    vector<vector<Point> >poly(contours.size());  
    for (unsigned int  i = 0; i < contours.size(); i++)  
    {  
        approxPolyDP(Mat(contours[i]), poly[i], 1,0);  //第三个参数为逼近精度,1为最小
    }  
  
    /* 绘出轮廓及其凸包*/  
    Mat drawing = Mat::zeros(threshold_output.size(), CV_8UC3);  
    for (unsigned int  i = 0; i< contours.size(); i++)  
    {  
  Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );  
         drawContours(drawing, poly, i, color, 1, 8, vector<Vec4i>(), 0, Point());   //绘出轮廓
    }  
    /// 把结果显示在窗体  
    namedWindow("contour", CV_WINDOW_AUTOSIZE); 
    imshow("Hull demo", drawing);  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值