测试代码很简单:
#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 范数函数。
正如您在文档中所读到的,这norm()
组函数都对通用InputArray
数据类型进行操作。所以,从这里,您可以看到这可以是 acv::Mat
或std::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) )
,但您可以依靠编译器来优化那。
归档时间: |
|
查看次数: |
25934 次 |
最近记录: |