opencv matchShapes详解
时间: 2023-07-01 17:28:03 浏览: 271
opencv函数手册
4星 · 用户满意度95%
`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`函数提取轮廓,并计算两个轮廓之间的相似度。最后,根据相似度的大小判断两个轮廓是否相似。
阅读全文