使用opencv范数函数获得两点的欧氏距离

Dan*_*iel 5 c++ opencv

测试代码很简单:

#include <opencv2/opencv.hpp>
#include <iostream>
int main()
{
        cv::Point2f a(0.f, 1.f);
        cv::Point2f b(3.f, 5.f);
        std::cout << cv::norm(a - b)<< std::endl;
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

效果很好。但是,如果我将行更改
std::cout << cv::norm(a - b)<< std::endl;
std::cout << cv::norm(a, b)<< std::endl;
std::cout << cv::norm(a - b, cv::NORM_L2)<< std::endl;
发生错误,它会告诉我此类函数无法匹配。
我不明白为什么Point2f类型无法转换,因为唯一的输入参数a-b效果很好。这里
给出的 opencv 范数函数。

keb*_*ebs 1

正如您在文档中所读到的,这norm()组函数都对通用InputArray数据类型进行操作。所以,从这里,您可以看到这可以是 acv::Matstd::vector但肯定不是cv::Point2f

在检查了源代码(3.0 的,但我怀疑 2.4 系列中有所不同)后,我发现该函数有 9 个重载,但唯一的重载只有cv::Point<>一个参数。

因此,您需要将您的积分转换为cv::Mat. 这可以很容易地完成,因为有一个构造函数cv::Mat将一个点作为参数。所以就这样做:

std::cout << cv::norm( cv::Mat(a), cv::Mat(b) ) << std::endl;
Run Code Online (Sandbox Code Playgroud)

但作为附带评论,我不确定这是最好的解决方案:它意味着额外的内存分配,并且直接计算距离可能会更快(即:。这看起来很严酷sqrt( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) ),但您可以依靠编译器来优化那。