opencv之轮廓特征属性及应用

1)点与轮廓的距离及位置关系
计算点与轮廓的距离及位置关系–pointPolygonTest()
double pointPolygonTest(InputArray contour,Point2f pt,bool measureDist);
&&contour 所需检测的轮廓对象
&&pt Point2f类型的pt 待判定位置的点
&&measureDist :是否计算距离的标志,当为true时,计算点到轮廓的最短距离,当为false时,只判定轮廓和点的位置关系,具体关系如下:
&&返回值为-1,表示点在轮廓外部
&&返回值为0 ,表示点在轮廓上
&&返回值为1 表示点在轮廓的内部
注意:如果你不需要知道具体距离,建议将第三个参数设置为false,这样速度会提高2到3倍
2)轮廓矩
0阶矩(m-00)———-为目标区域的质量
1阶矩(m_01,m_10)———-表示目标区域的质心
2阶矩(m_02,m_11,m_20)——–表示旋转半径
3阶矩(m_03,m_12,m_30)———描述目标的方位与斜度,反映目标的扭曲程度

中心矩:构造平移不变性
归一化中心矩:构造尺度 不变性
hu矩:构造旋转不变性

矩的计算–moments()
Moments moments(InputArray array,bool binaryImage=false)
&&array :输入参数,可以是光栅图像或二维数组
&&binaryImage:默认值false,非零像素取其本身值,若为true,则非零像素取1
&&返回值:Moments类的对象,返回对应的轮廓的空间矩/中心矩/和归一化中矩
(最高三阶)
// !spatial moments
double m00,m10,m01,m20,m11,m02,m30,m21,m12,m03;
// !central moments
double mu20,mu11,mu02,mu30,mu21,mu12,mu03;
//!central normalized moments
double nu20,nu11,nu02,nu30,nu21,nu12,nu03;

ex1:
Moments momenr0=moments(contours[i],false);
cout<


//轮廓匹配
Mat srcImg=imread("1.jpg");//读取模板图像
imshow("src",srcImg);
cvtColor(srcImg,srcImg,CV_BGR2GRAY);
threshold(srcImg,srcImg,100,255,CV_THRESH_BINARY);
vector<vector<Point>>contours;
vector<Vec4i>hierarcy;
findCOntours(srcImg,contours,hierarcy,CV_RETR_EXTERNAL,CVCHAIN_APPROX_NONE);
Mat srcImg2=imread("2.jpg");
imshow("src2",srcImg2);
Mat dstImg=srcImg2.clone();
cvtColor(srcImg2,srcImg2,CV_BGR2GRAY);
threshold(srcImg2,srcImg2,100,255,CV_THRESH_BINARY);
vector<vector<Point>contours2;
vector<Vec4i>hierarcy;
findContours(srcImg2,contours2,hierarcy2,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
while(1)
{
  for(int i=0;i<contours2.size();i++)
  {
   double matchRate=matchShapes(contours[0],contours2[i],CV_CONTOURS_MATCH_11,0,0);
   cout<<"index="<<i<<"---"<<setiosflags(ios::fixed)<<matchRate<<endl;
   if(matchRate<=0.1)
     drawContours(dstImg,contours2,i,Scalar(0,255,0),2,8);
    imshow("dst",dstImg);
    char key=waitKey();
    if(key==27)
     break;
  }
  break;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值