如何利用OPENCV的matchShapes进行轮廓匹配?uc3 0

15小时前 (19:18:11)阅读1回复0
雕刻瞎
雕刻瞎
  • 管理员
  • 注册排名6
  • 经验值329975
  • 级别管理员
  • 主题65995
  • 回复0
楼主
如何利用OPENCV的matchShapes进行轮廓匹配?目前也在进行轮廓匹配方面的研究,轮廓匹配的前提是要提取轮廓上的特征点并计算特征信息,然后根据特征信息进行匹配,提取特征点的算法有很多,经典的有SIFT,SURF,在openCV中都有实现,然后使用鲁棒性匹配算法robustMatch匹配,目前在看一篇论文《基于曲率特征的轮廓匹配算法》,讲到的匹配算法感觉比较简单,第一步是多边形逼近轮廓,来提取轮廓上的有效点;第二步是计算轮廓上有效点的曲率;  主要步骤1.读取一幅图片,并且对其进行二值化,2.对其进行形态学处理,减少孔洞等次要特征,保留其
  1. 如何利用OPENCV的matchShapes进行轮廓匹配?

如何利用OPENCV的matchShapes进行轮廓匹配?

如何利用OPENCV的matchShapes进行轮廓匹配?uc3 0

目前也在进行轮廓匹配方面的研究。轮廓匹配的前提是要提取轮廓上的特征点并计算特征信息,然后根据特征信息进行匹配。提取特征点的算法有很多,经典的有SIFT,SURF,在openCV中都有实现,然后使用鲁棒性匹配算法robustMatch匹配。目前在看一篇论文《基于曲率特征的轮廓匹配算法》,讲到的匹配算法感觉比较简单,第一步是多边形逼近轮廓,来提取轮廓上的有效点;

第二步是计算轮廓上有效点的曲率;

  主要步骤1.读取一幅图片,并且对其进行二值化。2.对其进行形态学处理,减少孔洞等次要特征,保留其主要特征。3.进行边缘提取。4.进行形状轮廓匹配,得到其匹配值,从而判断是否是同一个形状。  下面是演示代码:  #include <iostream>  #include "opencv2/opencv.hpp"  using namespace std;  using namespace cv;  int main()  {  Mat k=imread("E:/TestGit/8.jpg",0);  Mat f;  Mat k1=imread("E:/TestGit/9.jpg",0);  Mat f1;  threshold(k,f,50,255,THRESH_BINARY);//对图像进行二值化  threshold(k1,f1,50,255,THRESH_BINARY);  Mat closerect=getStructuringElement(MORPH_RECT,Size(3,3)); //进行结构算子生成  morphologyEx(f,f,MORPH_OPEN,closerect);  morphologyEx(f1,f1,MORPH_OPEN,closerect);//进行形态学开运算  Mat dst = Mat::zeros(k.rows, k.cols, CV_8UC3);  Mat dst1 = Mat::zeros(k1.rows, k1.cols, CV_8UC3);  vector<vector<Point>> w,w1;  vector<Vec4i> hierarchy,hierarchy1 ;  findContours(f,w,hierarchy,RETR_CCOMP,CHAIN_APPROX_SIMPLE);//提取轮廓元素  findContours(f1,w1,hierarchy1,RETR_CCOMP,CHAIN_APPROX_SIMPLE);  FileStorage fs("f.dat",FileStorage::WRITE);  fs<<"f"<<w1[0];  int idx=0;  double ffff=matchShapes(w[0],w1[0],CV_CONTOURS_MATCH_I3,1.0);//进行轮廓匹配  std::cout<<ffff<<std::endl;  system("pause");  return 0;  }  这样,我们就得到了轮廓边缘的提取和匹配,满足了需要。而不同的算子具有不同的匹配算子方法。

0
回帖

如何利用OPENCV的matchShapes进行轮廓匹配?uc3 0 期待您的回复!

取消
载入表情清单……
载入颜色清单……
插入网络图片

取消确定

图片上传中
编辑器信息
提示信息