OpenCV matchShapes()输出值

时间:2016-10-26 07:33:12

标签: ios objective-c swift opencv image-processing

如何使用OpenCV matchShapes输出中的值?我们实现了OpenCV matchShapes函数来比较两个图像,特别是形状。但是当我们得到答案时,我们对如何使用这些值感到困惑?

代码是

- (bool) 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++)
{
    //cout<<contours1[i]<<endl;
    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);
    cout<<" "<<ans<<endl;
}

std::cout<<"The answer is "<<ans<<endl;

if (ans<=20) {
    return true;
}

return false;

}

输出值

  

0.225069    0.234417    0    7.63599    0    7.06392    0.335966    0.211358    0.327552    0.842969    0.761659    0.614039

图片为Image

2 个答案:

答案 0 :(得分:1)

请参阅我对imoutidi的回答的评论。这是一个直观的解释: 第一个col是两个原始图像,第二个是canny边缘。 3.col是在两个图像中具有相同索引的检测到的形状的任意选择。如你所见,它甚至不能保证它们对应于人类看到它们的相同图像部分。你最终比较的是这种情况下的不同三角形,它们对整体形状相似性几乎没有说明。两个形状阵列甚至不具有相同的尺寸,因为例如底部图中存在更多结构(例如粗线之间的小形状)。在4. col中是数组中的最后一个形状。这是您比较图像的最佳选择。在这个例子中,我得到了一个值为0.0920794532771的相似性。 enter image description here

答案 1 :(得分:0)

如果我理解你的问题,你想知道matchShapes()的返回值代表什么。 在给定两个轮廓(形状)的情况下,函数返回相似性度量(值)。较小的值表示两个形状相似,而且值不大。

这里有一个很好的解释:http://docs.opencv.org/3.1.0/d5/d45/tutorial_py_contours_more_functions.html(检查第三段)。

另请查看文档:{​​{3}}