解释来自 OpenCV matchShapes() 的数字

Posted

技术标签:

【中文标题】解释来自 OpenCV matchShapes() 的数字【英文标题】:Explain numbers from OpenCV matchShapes() 【发布时间】:2016-08-26 07:14:35 【问题描述】:

我正在开发一个应用程序,我使用 OpenCV 的 matchShapes() 比较两个图像。

我在Objective-C代码中实现的方法如下

- (void) someMethod:(UIImage *)image :(UIImage *)temp 

RNG rng(12345);

cv::Mat src_base, hsv_base;
cv::Mat src_test1, hsv_test1;

src_base = [self cvMatWithImage:image];
src_test1 = [self cvMatWithImage:temp];

int thresh=150;
double ans=0, result=0;

Mat imageresult1, imageresult2;

cv::cvtColor(src_base, hsv_base, cv::COLOR_BGR2HSV);
cv::cvtColor(src_test1, hsv_test1, cv::COLOR_BGR2HSV);

std::vector<std::vector<cv::Point>>contours1, contours2;
std::vector<Vec4i>hierarchy1, hierarchy2;

Canny(hsv_base, imageresult1, thresh, thresh*2);
Canny(hsv_test1, imageresult2, thresh, thresh*2);

findContours(imageresult1,contours1,hierarchy1,CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));
for(int i=0;i<contours1.size();i++)

    Scalar color=Scalar(rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255));
    drawContours(imageresult1,contours1,i,color,1,8,hierarchy1,0,cv::Point());


findContours(imageresult2,contours2,hierarchy2,CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));
for(int i=0;i<contours2.size();i++)

    Scalar color=Scalar(rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255));
    drawContours(imageresult2,contours2,i,color,1,8,hierarchy2,0,cv::Point());


for(int i=0;i<contours1.size();i++)

    ans = matchShapes(contours1[i],contours2[i],CV_CONTOURS_MATCH_I1,0);
    std::cout<<ans<<" ";
    getchar();



我得到了这些结果,但不知道这些数字究竟意味着什么:0 0 0.81946 0.816337 0.622353 0.634221 0

【问题讨论】:

我在研究 matchShapes 时发现这个 article 很有帮助...把它留在这里以防有人需要它 【参考方案1】:

this blogpost 我认为应该更深入地了解 matchShapes 的工作原理。

您显然已经知道输入参数是什么,但对于那些发现不知道的人来说:

double matchShapes(InputArray contour1, InputArray contour2, int method, double parameter)

输出是一个指标,其中:

结果越低,匹配越好。它是根据 hu 矩值计算的。文档中解释了不同的测量方法。

提到的博文中的发现如下:( max = 1 , min = 0)

我得到了以下结果:

    Matching Image A with itself = 0.0
    Matching Image A with Image B = 0.001946
    Matching Image A with Image C = 0.326911

看,即使是图像旋转也不会对这种比较产生太大影响。

这基本上表明您的结果:

    前两个很棒,你在 0 点有一个完整的比赛 后两个 (0.81946 0.816337) 完全不兼容 第三个两个都可以,大约 62% 不兼容 最后一个是完全匹配的。

如果我的计算机视觉学习教会了我任何事情,除非你 100% 使用相同的图像,否则总是对完全匹配持怀疑态度。

Edit1:我认为它也可能是旋转不变的,因此在您的情况下,您可能有三条非常相似的绘制线,它们已旋转到相同的方式(即水平)并进行比较

【讨论】:

感谢您的精彩解释。您对如何使用这些数字有什么建议吗? 在博文中他只有一个号码,而在我的情况下有一堆 哦,我看到他用的是countour [0] 很高兴你知道了。它基本上是它准确度的百分比。如果我是你,我会从一条已知测量线开始,然后从那里建立起来。然后您只需使用该结果并使用它(即如果它> 80%,它必须是匹配的) 如何组合任意数量轮廓的结果?

以上是关于解释来自 OpenCV matchShapes() 的数字的主要内容,如果未能解决你的问题,请参考以下文章

opencv计算两个轮廓之间hu矩相似程度,MatchShapes

如何利用OPENCV的matchShapes进行轮廓匹配

如何利用OPENCV的matchShapes进行轮廓匹配?

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

图像或轮廓的Hu矩的定义优缺点适用范围,并利用OpenCV的函数HuMoments()和matchShapes()实现Hu矩的计算和轮廓匹配

在opencv中检测罐子或瓶子