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

如何利用OPENCV的matchShapes进行轮廓匹配,第1张

主要步骤1读取一幅,并且对其进行二值化。2对其进行形态学处理,减少孔洞等次要特征,保留其主要特征。3进行边缘提取。4进行形状轮廓匹配,得到其匹配值,从而判断是否是同一个形状。

下面是演示代码:

#include <iostream>

#include "opencv2/opencvhpp"

using namespace std;

using namespace cv;

int main()

{

Mat k=imread("E:/TestGit/8jpg",0);

Mat f;

Mat k1=imread("E:/TestGit/9jpg",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(krows, kcols, CV_8UC3);

Mat dst1 = Mat::zeros(k1rows, k1cols, 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("fdat",FileStorage::WRITE);

fs<<"f"<<w1[0];

int idx=0;

double ffff=matchShapes(w[0],w1[0],CV_CONTOURS_MATCH_I3,10);//进行轮廓匹配

std::cout<<ffff<<std::endl;

system("pause");

return 0;

}

这样,我们就得到了轮廓边缘的提取和匹配,满足了需要。而不同的算子具有不同的匹配算子方法。

cvFindContours 中CV_RETR_CCOMP这个参数是提取所有轮廓,顶层为连通域的外围边界,次层为洞的内层边界。h_next是下一个最外层的轮廓,而v_next是次层的轮廓,

用于运动轮廓提取的方法主要有:帧间差分法,滑动平均法、混合高斯建模提取前景,还有所谓的光流法、Codebook法,经过试验证明,帧间差分法效果可待商榷,滑动平均法对帧间差分有所改进,但对于室外的情况,光线的变化对其有一定的影响,混合高斯和Codebook法对光线比较敏感,应用此法得想办法在应用此两法前对视频序列进行预处理,光流法实现的主要有(Horn-Schunck和Lucas-Kanade),但计算量大,难以满足实时性的需求。

以上就是关于如何利用OPENCV的matchShapes进行轮廓匹配全部的内容,包括:如何利用OPENCV的matchShapes进行轮廓匹配、opencv 提取中间那些小矩形的轮廓、opencv 怎样提取运动物体的轮廓等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9297316.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存