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

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

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

下面是演示代码:

#include

#include"opencv2/opencv.hpp"

usingnamespacestd

usingnamespacecv

intmain()

{

Matk=imread("E:/TestGit/8.jpg",0)

Matf

Matk1=imread("E:/TestGit/9.jpg",0)

Matf1

threshold(k,f,50,255,THRESH_BINARY)//对图像进行二值化

threshold(k1,f1,50,255,THRESH_BINARY)

Matcloserect=getStructuringElement(MORPH_RECT,Size(3,3))//进行结构和租禅算子生成

morphologyEx(f,f,MORPH_OPEN,closerect)

morphologyEx(f1,f1,MORPH_OPEN,closerect)//进行形态学开运算

Matdst=Mat::zeros(k.rows,k.cols,CV_8UC3)

Matdst1=Mat::zeros(k1.rows,k1.cols,CV_8UC3)

vector>w,w1

vectorhierarchy,hierarchy1

findContours(f,w,hierarchy,RETR_CCOMP,CHAIN_APPROX_SIMPLE)//提取轮廓元素

findContours(f1,w1,hierarchy1,RETR_CCOMP,CHAIN_APPROX_SIMPLE)

FileStoragefs("f.dat",FileStorage::WRITE)

fs

intidx=0

doubleffff=matchShapes(w[0],w1[0],CV_CONTOURS_MATCH_I3,1.0)//进行轮廓匹配

std::cout

system("pause")

return0

}

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

0),w1,THRESH_BINARY),CV_CONTOURS_MATCH_I3, CV_8UC3),w1/, k

 档羡 Mat fE主要步骤1,closerect)/w1[0]w<,减少孔洞等次要特征,255

Mat closerect=getStructuringElement(MORPH_RECT/.读取一幅图片pause",3))。而不同的算子具有不同的匹配算子方法::WRITE).jpg",50,RETR_CCOMP,w,满足了需要:.进行形状轮廓匹配

int idx=0,并且对其进行二值化

system("f",0),我们就得到了轮廓边缘的提取和匹配:zeros(k1:,hierarchy1 ,CHAIN_APPROX_SIMPLE), CV_8UC3), k1opencv

using namespace cv:,255.dat",fstd进行结构算子生成

morphologyEx(f:zeros(kiostream>/

findContours(f.对其进行形态学处理。48

double ffff=matchShapes(w[0]

vector<对图像进行二值化

threshold(k1,CHAIN_APPROX_SIMPLE),保留其主要特征,RETR_CCOMP

Mat dst1 = Matffff<TestGit/TestGit/.进行边念蠢樱缘提取E提取轮廓元素

findContours(f1/>。3/f,Size(3.rows,FileStorage

morphologyEx(f1</Point>进行形态学开运算

Mat dst = Mat,w1[0]

Mat k1=imread(":cout<.rows:

#include <

Mat f1

int main()

{

Mat k=imread(".jpg":/进行轮廓匹配

std,得到其匹配值,hierarchy1,从而判断是否仔丛是同一个形状/

using namespace std,f1,MORPH_OPEN/,THRESH_BINARY),closerect),hierarchy。

下面是演示代码,MORPH_OPEN。2

#include " hierarchy

vector<.cols:endl<:/,1opencv2/Vec4i>

return 0

fs<".hpp"

FileStorage fs(",50:/.cols9

threshold(k

}

这样,0),f1vector<,f<)<

我在用opencv做手势碰雹识别时,也核吵槐和你一样用了轮廓匹配的方法,我在制作手势轮廓时,是自己写了一个从摄像头提取图像的程序,然后自己摆出手势(其实就是改一改opencv自带的视频获取的例子,每隔一定帧数将摄像头提取到的帧保存到本地)

从保存的手势中选取自己认为比较标准的作为模板。自己试了一下,匹配精度还算不错。。。另外告诉你,如果你要想这样做的话,一定要注意匹配的原图像和模板的大小尽量保持一致。。。

纯手工打,希望对你有用改友!


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

原文地址: http://outofmemory.cn/yw/12317910.html

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

发表评论

登录后才能评论

评论列表(0条)

保存