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自带软件-画图进行绘制的,大家可以绘制自己的两张图用于验证程序。注意确保只有黑白两色。
这两张图片里面的物体轮廓形状、大小完全一样。第二个图片相对于第一个旋转了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