如何处理matchShapes()函数的输出

时间:2014-01-15 09:00:41

标签: c++ opencv shapes

以下是用于比较2个形状的程序代码。

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace cv;
using namespace std;

int main()
{
    RNG rng(12345);
    Mat image1=cvLoadImage("C:/Users/Administrator/Desktop/circle1.png",1);
    Mat image2=cvLoadImage("C:/Users/Administrator/Desktop/circle2.png",1);
    Mat imagegray1, imagegray2, imageresult1, imageresult2;
    int thresh=150;
    double ans=0, result=0;;
    cvtColor(image1, imagegray1,CV_BGR2GRAY);
    cvtColor(image2,imagegray2,CV_BGR2GRAY);

    vector<vector<Point>>contours1, contours2;
    vector<Vec4i>hierarchy1, hierarchy2;

    Canny(imagegray1, imageresult1,thresh, thresh*2);
    Canny(imagegray2, 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,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,Point());
    }
    for(int i=0;i<contours1.size();i++)
    {
        ans=matchShapes(contours1[i],contours2[i],CV_CONTOURS_MATCH_I1,0);
        cout<<ans;
        getchar();
    }
}

我用这些图片运行它:

Image 1 enter image description here

在这种情况下的结果,即变量ans的值是:

  

8.97971e-007

     

1.73019e-005

     

2.25315e-006

     

2.21416e-005

如何使用这些值来确定形状是否相互匹配?

1 个答案:

答案 0 :(得分:2)

我找到了显示结果的this。当匹配两个相同的轮廓并且0,001具有旋转轮廓时,他获得0,00。我会说在0,1以上没有匹配,具体取决于首选精度。除了这个以外,我无法找到解释返回值的任何内容。

8,97971e-7 = 0,000000897971
1,73019e-5 = 0,0000173019
2,25315e-6 = 0,00000225315
2,21416e-5 = 0,0000221416

您的结果显示所有找到的轮廓都是非常好的匹配。尝试drawContours查看实际找到的轮廓,然后结果可能变得可以理解。也许您也可以申请approxPolyDP,看看您是否会获得更好的结果。