测试代码很简单:
#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;
}
它工作正常。但是如果我换行
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 范数函数。
原文由 Daniel 发布,翻译遵循 CC BY-SA 4.0 许可协议
正如您在文档中看到的那样,
norm()
函数集都在通用InputArray
数据类型上运行。因此,从 这里,您可以看到这可以是cv::Mat
或std::vector
但肯定不是cv::Point2f
。在检查了源代码(3.0,但我怀疑它在 2.4 系列中有所不同)后,我看到该函数有 9 个重载,但唯一的
cv::Point<>
只有一个参数。因此,您需要将您的积分转换为
cv::Mat
。这可以很容易地完成,因为有一个cv::Mat
的构造函数,它将一个点作为参数。所以就这样做:但作为旁注,我不确定这是最好的解决方案:它意味着额外的内存分配,并且直接计算距离可能更快(即:
sqrt( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) )
。看起来很苛刻,但你可以依靠编译器来优化它。