如何利用OPENCV的matchShapes进行轮廓匹配?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何利用OPENCV的matchShapes进行轮廓匹配?相关的知识,希望对你有一定的参考价值。
参考技术A 主要步骤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
vector
findContours(f,w,hierarchy,RETR_CCOMP,CHAIN_APPROX_SIMPLE);//提取轮廓元素
findContours(f1,w1,hierarchy1,RETR_CCOMP,CHAIN_APPROX_SIMPLE);
FileStoragefs("f.dat",FileStorage::WRITE);
fs<<"f"<
intidx=0;
doubleffff=matchShapes(w[0],w1[0],CV_CONTOURS_MATCH_I3,1.0);//进行轮廓匹配
std::cout<
system("pause");
return0;
这样,我们就得到了轮廓边缘的提取和匹配,满足了需要。而不同的算子具有不同的匹配算子方法。
- 官方服务
- 官方网站官方网站
opencv 利用cv.matchShapes()函数实现图像识别技术
在待识别图像上找到模板图像
待识别图像:
模板图像:
识别原理
1. 将待识别图像 -> 灰度图像 -> 二值图像
2. 通过轮廓检索函数 cv.findContours 找到待识别图像所有轮廓
3. 模板图像 -> 灰度图像 -> 二值图像
4. 通过轮廓检索函数 cv.findContours 找到模板图像中字母 A 的外轮廓
5. 将第2步得到的轮廓逐一和第4步得到的轮廓 通过 cv.matchShapes 函数进行形状匹配。找到其中最小值,最小值对应的待识别图像中的轮廓即为匹配到的模板图像
6. 标出在待识别图像中找到的模板图像
实验:图像匹配
import cv2 as cv
import numpy as np
# 载入原图
img = cv.imread(‘abc.jpg‘, 0)
# 在下面这张图像上作画
image1 = cv.cvtColor(img,cv.COLOR_GRAY2BGR)
# 二值化图像
_, thresh = cv.threshold(img, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
# 搜索轮廓
contours, hierarchy = cv.findContours(thresh, 3, 2)
hierarchy = np.squeeze(hierarchy)
# 载入标准模板图
img_a = cv.imread(‘template_a.jpg‘, 0)
_, th = cv.threshold(img_a, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
contours1, hierarchy1 = cv.findContours(th, 3, 2)
# 字母A的轮廓
template_a = contours1[0]
# 记录最匹配的值的大小和位置
min_pos = -1
min_value = 2
for i in range(len(contours)):
# 参数3:匹配方法;参数4:opencv预留参数
value = cv.matchShapes(template_a,contours[i],1,0.0)
if value < min_value:
min_value = value
min_pos = i
# 参数3为0表示绘制本条轮廓contours[min_pos]
cv.drawContours(image1,[contours[min_pos]],0,[255,0,0],3)
cv.imshow(‘result‘,image1)
cv.waitKey(0)
cv.destroyAllWindows()
实验结果
以上是关于如何利用OPENCV的matchShapes进行轮廓匹配?的主要内容,如果未能解决你的问题,请参考以下文章
opencv 利用cv.matchShapes()函数实现图像识别技术
图像或轮廓的Hu矩的定义优缺点适用范围,并利用OpenCV的函数HuMoments()和matchShapes()实现Hu矩的计算和轮廓匹配
opencv计算两个轮廓之间hu矩相似程度,MatchShapes