OpenCv中matchShapes()函数的使用

cv::matchShapes()函数的使用

在老版本的OpenCV中,该函数的原型为cvMatchShapes(),其使用方法可以参考博客:https://blog.csdn.net/hhy018/article/details/39080947
在OpenCv3及以上的版本中保留了cvMatchShapes()函数;但这里主要介绍与其功能一样的matchShapes()函数,相比与之前的版本,该函数使用起来更加方便,对向量和Mat类的支持度更好。

1.参数解释
在这里插入图片描述
参考网站:https://docs.opencv.org/4.5.5/d3/dc0/group__imgproc__shape.html#gaadc90cb16e2362c9bd6e7363e6e4c317
contour1:轮廓向量或者灰度图。
contour2:轮廓向量或者灰度图。
method:使用的比较方式。
parameter:现在没用,直接设为0。

注:contour1与contour2无顺序之分;contour的类型一般为vector的点集,由findContours()函数求出,也可以自己给定;coutours还可以是双通道的Mat矩阵。
method的具体枚举类型及对应的计算方法请参考:
method用法介绍
下面用两张图片来进行演示:
图片使用Windows自带软件-画图进行绘制的,大家可以绘制自己的两张图用于验证程序。注意确保只有黑白两色。
文件名:1.png
文件名:2.png
这两张图片里面的物体轮廓形状、大小完全一样。第二个图片相对于第一个旋转了90度。图片里面只有黑白两个颜色,所以确保我们在一张图片中只会检测到一个轮廓,可以方便我们的演示。
下面依次提取这两个轮廓,并进行匹配。预期结果是完全匹配,程序输出的匹配结果为0。

2.示例代码:



#include<vector>
#include<iostream>
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
using namespace std;
using namespace cv;
int main()
{
   
	Mat img1 = cv::imread("C:\\Users\\86994\\Desktop\\1.png"); // 读入图片1
	Mat img2 = cv::imread("C:\\Users\\86994\\Desktop\\2.png"); // 读入图片2
	Mat img1_copy = img1.clone(); // 深拷贝图片,用于后面在其上绘制轮廓
	Mat img2_copy 
  • 7
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
`matchShapes`是OpenCV一个用于比较两个轮廓形状相似度的函数。它可以用于图像识别、物体检测、图像分类等多个领域。该函数的原型如下: ```c++ double matchShapes(InputArray contour1, InputArray contour2, int method, double parameter); ``` 其,`contour1`和`contour2`是两个输入的轮廓,`method`是指定轮廓匹配算法的类型,`parameter`是指定算法的一些参数。 目前,OpenCV支持三种轮廓匹配算法: - `CV_CONTOURS_MATCH_I1`:基于L1距离计算两个轮廓之间的相似度。 - `CV_CONTOURS_MATCH_I2`:基于L2距离计算两个轮廓之间的相似度。 - `CV_CONTOURS_MATCH_I3`:基于Hu矩计算两个轮廓之间的相似度。 其,`CV_CONTOURS_MATCH_I3`是最常用的一种算法,使用的是Hu矩。Hu矩是一种对图像旋转、平移、缩放不变的特征描述符,可以用于图像识别和匹配。在使用`CV_CONTOURS_MATCH_I3`算法时,`parameter`参数需要设置为0。 `matchShapes`函数返回的是两个轮廓之间的相似度,返回值越小说明两个轮廓越相似,返回值越大说明两个轮廓越不相似。常用的阈值为0.1,如果返回值小于0.1,则认为两个轮廓相似,否则认为不相似。 下面是一个使用`matchShapes`进行轮廓匹配的例子: ```c++ #include <opencv2/opencv.hpp> using namespace cv; int main() { Mat img1 = imread("contour1.jpg"); Mat img2 = imread("contour2.jpg"); cvtColor(img1, img1, COLOR_BGR2GRAY); cvtColor(img2, img2, COLOR_BGR2GRAY); threshold(img1, img1, 127, 255, THRESH_BINARY); threshold(img2, img2, 127, 255, THRESH_BINARY); std::vector<std::vector<Point>> contours1, contours2; findContours(img1, contours1, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); findContours(img2, contours2, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); double similarity = matchShapes(contours1[0], contours2[0], CV_CONTOURS_MATCH_I3, 0); std::cout << "Similarity: " << similarity << std::endl; if (similarity < 0.1) std::cout << "Contours are similar." << std::endl; else std::cout << "Contours are not similar." << std::endl; return 0; } ``` 该例子,我们首先读入两个轮廓图片,然后将其转换为灰度图,并进行二值化处理。接着,使用`findContours`函数提取轮廓,并计算两个轮廓之间的相似度。最后,根据相似度的大小判断两个轮廓是否相似。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值