如何利用OPENCV的matchShapes进行轮廓匹配
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何利用OPENCV的matchShapes进行轮廓匹配相关的知识,希望对你有一定的参考价值。
主要步骤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;
这样,我们就得到了轮廓边缘的提取和匹配,满足了需要。而不同的算子具有不同的匹配算子方法。 参考技术A 如何利用OPENCV的matchShapes进行轮廓匹配?主要步骤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);//提取轮廓元素
如何利用opencv进行图形的旋转以及画出一个旋转的矩形
参考技术A // testRotateRect.cpp : 定义控制台应用程序的入口点。02 //
03 #include "stdafx.h"
04 #include "opencv2/opencv.hpp"
05 using namespace std;
06 using namespace cv;
07 int _tmain(int argc, _TCHAR* argv[])
08
09 Mat image(200,200,CV_8UC3,Scalar(0));
10 RotatedRect rRect=RotatedRect(Point2f(100,100),Size2f(100,50),30); //定义一个旋转矩形
11 Point2f vertices[4];
12 rRect.points(vertices);//提取旋转矩形的四个角点
13 for(int i=0;i<4;i++)
14
15 line(image,vertices[i],vertices[(i+1)%4],Scalar(0,255,0));//四个角点连成线,最终形成旋转的矩形。
16
17 Mat img=imread("d:/fff.jpg");
18 imshow("ran",image);
19 waitKey();
20 return 0;
21 本回答被提问者和网友采纳
以上是关于如何利用OPENCV的matchShapes进行轮廓匹配的主要内容,如果未能解决你的问题,请参考以下文章
opencv 利用cv.matchShapes()函数实现图像识别技术
图像或轮廓的Hu矩的定义优缺点适用范围,并利用OpenCV的函数HuMoments()和matchShapes()实现Hu矩的计算和轮廓匹配
opencv计算两个轮廓之间hu矩相似程度,MatchShapes