如何使用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
答案 0 :(得分:1)
请参阅我对imoutidi的回答的评论。这是一个直观的解释: 第一个col是两个原始图像,第二个是canny边缘。 3.col是在两个图像中具有相同索引的检测到的形状的任意选择。如你所见,它甚至不能保证它们对应于人类看到它们的相同图像部分。你最终比较的是这种情况下的不同三角形,它们对整体形状相似性几乎没有说明。两个形状阵列甚至不具有相同的尺寸,因为例如底部图中存在更多结构(例如粗线之间的小形状)。在4. col中是数组中的最后一个形状。这是您比较图像的最佳选择。在这个例子中,我得到了一个值为0.0920794532771的相似性。
答案 1 :(得分:0)
如果我理解你的问题,你想知道matchShapes()的返回值代表什么。 在给定两个轮廓(形状)的情况下,函数返回相似性度量(值)。较小的值表示两个形状相似,而且值不大。
这里有一个很好的解释:http://docs.opencv.org/3.1.0/d5/d45/tutorial_py_contours_more_functions.html(检查第三段)。
另请查看文档:{{3}}