解释来自 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
图像识别(13)——手势识别——用matchShapes识别手形数字
图像或轮廓的Hu矩的定义优缺点适用范围,并利用OpenCV的函数HuMoments()和matchShapes()实现Hu矩的计算和轮廓匹配