如何使用形状距离和公共接口在Opencv中查找Hausdorff距离?

如何使用形状距离和公共接口在Opencv中查找Hausdorff距离?,opencv,Opencv,我想找到两个Canny探测器输出图像之间的Hausdorff距离,其中包含一组轮廓,以找到两个形状的相似性。为此,我需要找到Hausdorff距离估计。Opencv中是否实现了此功能? 我在Opencv API参考中找到了它,但我找不到如何在任何地方使用它。 有谁能指导我如何使用这些功能吗?有一个 为此,您需要使用opencv3.0(主分支) 实际上,hausdorff距离本身并没有那么神秘 // internal helper: int distance_2( const std::vecto

我想找到两个Canny探测器输出图像之间的Hausdorff距离,其中包含一组轮廓,以找到两个形状的相似性。为此,我需要找到Hausdorff距离估计。Opencv中是否实现了此功能? 我在Opencv API参考中找到了它,但我找不到如何在任何地方使用它。 有谁能指导我如何使用这些功能吗?

有一个 为此,您需要使用opencv3.0(主分支)

实际上,hausdorff距离本身并没有那么神秘

// internal helper:
int distance_2( const std::vector<cv::Point> & a, const std::vector<cv::Point>  & b )
{
    int maxDistAB = 0;
    for (size_t i=0; i<a.size(); i++)
    {
        int minB = 1000000;
        for (size_t j=0; j<b.size(); j++)
        {
            int dx = (a[i].x - b[j].x);     
            int dy = (a[i].y - b[j].y);     
            int tmpDist = dx*dx + dy*dy;

            if (tmpDist < minB)
            {
                minB = tmpDist;
            }
            if ( tmpDist == 0 )
            {
                break; // can't get better than equal.
            }
        }
        maxDistAB += minB;
    }
    return maxDistAB;
}

double distance_hausdorff( const std::vector<cv::Point> & a, const std::vector<cv::Point> & b )
{
    int maxDistAB = distance_2( a, b );
    int maxDistBA = distance_2( b, a );   
    int maxDist = std::max(maxDistAB,maxDistBA);

    return std::sqrt((double)maxDist);
}
//内部帮助程序:
整数距离_2(常数标准::向量&a,常数标准::向量&b)
{
int-maxDistAB=0;
对于(size_t i=0;i有一个
为此,您需要使用opencv3.0(主分支)

实际上,hausdorff距离本身并没有那么神秘

// internal helper:
int distance_2( const std::vector<cv::Point> & a, const std::vector<cv::Point>  & b )
{
    int maxDistAB = 0;
    for (size_t i=0; i<a.size(); i++)
    {
        int minB = 1000000;
        for (size_t j=0; j<b.size(); j++)
        {
            int dx = (a[i].x - b[j].x);     
            int dy = (a[i].y - b[j].y);     
            int tmpDist = dx*dx + dy*dy;

            if (tmpDist < minB)
            {
                minB = tmpDist;
            }
            if ( tmpDist == 0 )
            {
                break; // can't get better than equal.
            }
        }
        maxDistAB += minB;
    }
    return maxDistAB;
}

double distance_hausdorff( const std::vector<cv::Point> & a, const std::vector<cv::Point> & b )
{
    int maxDistAB = distance_2( a, b );
    int maxDistBA = distance_2( b, a );   
    int maxDist = std::max(maxDistAB,maxDistBA);

    return std::sqrt((double)maxDist);
}
//内部帮助程序:
整数距离_2(常数标准::向量&a,常数标准::向量&b)
{
int-maxDistAB=0;

对于(size_t i=0;我非常感谢@berak的快速回复。这对我帮助很大。你为什么这么做;
maxDistAB+=minB
?你不应该计算最小距离吗?根据,这是你应该做的。非常感谢@berak的快速回复。这对我帮助很大。你为什么要这么做;
maxDistAB+=minB
?您不应该计算最小距离吗?根据,这是您应该做的