opencv matchshapes()函数的原理
时间: 2024-05-24 19:13:20 浏览: 33
OpenCV中的matchShapes()函数是用于比较两个形状之间的相似度的函数。它基于Hu矩形式,将两个形状的矩形式进行比较,并返回相似度指标。
该函数的原理是:首先,将两个形状的轮廓转换为点集形式,然后计算它们的Hu矩形式。接着,根据Hu矩形式的特性,计算两个形状之间的相似度指标(称为Hu距离)。Hu距离越小,表示两个形状越相似。因此,该函数返回的值越小,表示两个形状的相似度越高。
总之,matchShapes()函数通过计算两个形状的Hu矩形式,并计算它们之间的相似度指标,来比较两个形状之间的相似度。
相关问题
opencv matchshapes详解
`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`函数提取轮廓,并计算两个轮廓之间的相似度。最后,根据相似度的大小判断两个轮廓是否相似。
opencv matchShapes详解
`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`函数提取轮廓,并计算两个轮廓之间的相似度。最后,根据相似度的大小判断两个轮廓是否相似。