如何利用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>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<<"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

解释来自 OpenCV matchShapes() 的数字

图像识别(13)——手势识别——用matchShapes识别手形数字

youcans 的 OpenCV 例程200篇198.基于不变矩的形状相似性检测