findContours和drawContours的使用

虽然书上说与Canny的区别是,Canny没有将边缘看成整体,这里将边缘看成一个整体的轮廓,但还是没有看出来区别……

程序一:基础的轮廓检测和绘制,基于二值化

int main()

{
   Mat src=imread("renti2.jpg",0);
   Mat dst,result;
   threshold(src,dst,160,255,THRESH_BINARY);
   //blur(src,src,Size(3,3));
   //Canny(src,dst,100,200,3);
   result.create(src.size(),CV_8UC3);
   imshow("a",dst);
   //waitKey(0);
   vector<vector<Point>> coutours;
   vector<Vec4i> hierarchy;


   findContours(dst,coutours,hierarchy,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE);
   //第一个参数,输入的二值图像
   //第二个参数轮廓存储的点向量
   //第三个参数,输出向量,hierarchyp[i][0~4]分别代表第i个轮廓的后一个轮廓0,前一个轮廓1,父轮廓2,内嵌轮廓3;
   //第四个参数,轮廓检索模式

   //第五个参数,轮廓近似办法


   for(int i=0;i>=0;i=hierarchy[i][0])
   {
   drawContours(result,coutours,i,Scalar(255,0,0),1,8);
   //第一个参数,Mat型输入图像
   //第二个参数,所有输入轮廓的点向量
   //第三个参数,轮廓的int型指示变量,用于指示画哪一个轮廓
   //第四个参数,颜色
   //第五个参数,线条粗度,FILLED为填充,默认值1,当值为-1或者FILLED时,就填充内部;
   //第六个参数,线条类型,默认为8


   }
   imshow("b",result);
   waitKey(0);

}

程序二:利用滑动条来控制的轮廓检测

int main()
{
   src=imread("kele.jpg",0);
   //threshold(src,dst,160,255,THRESH_BINARY);
   


   namedWindow("结果");
   createTrackbar("阈值","结果",&thres,125,onThresbar);
   onThresbar(thres,0);
   waitKey(0);


}


void static onThresbar(int,void*)
{
     blur(src,src,Size(3,3));
     Canny(src,dst,2*thres,thres,3);
     
   //waitKey(0);
   vector<vector<Point>> coutours;
   vector<Vec4i> hierarchy;
   result=Mat::zeros(src.size(),CV_8UC3);


   findContours(dst,coutours,hierarchy,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE);
   //第一个参数,输入的二值图像
   //第二个参数轮廓存储的点向量
   //第三个参数,输出向量,hierarchyp[i][0~4]分别代表第i个轮廓的后一个轮廓0,前一个轮廓1,父轮廓2,内嵌轮廓3;
   //第四个参数,轮廓检索模式
   //第五个参数,轮廓近似办法


   for(int i=0;i>=0;i=hierarchy[i][0])
   {
   drawContours(result,coutours,i,Scalar(255,0,0),1,8);
   //第一个参数,Mat型输入图像
   //第二个参数,所有输入轮廓的点向量
   //第三个参数,轮廓的int型指示变量,用于指示画哪一个轮廓
   //第四个参数,颜色
   //第五个参数,线条粗度,FILLED为填充,默认值1,当值为-1或者FILLED时,就填充内部;
   //第六个参数,线条类型,默认为8


   }
   imshow("结果",result);
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值