gpt4 book ai didi

c++ - 使用opencv范数函数获取两点的欧氏距离

转载 作者:搜寻专家 更新时间:2023-10-31 01:34:55 28 4
gpt4 key购买 nike

测试代码很简单:

#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范数函数here .

最佳答案

请注意,sqrt( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) )sqrt( ( a - b).x * (a - b).x + (a - b).y * (a - b).y ),所以你可以调用 cv::norm(a - b)

然而,根据这个(尽管是旧的)link,单点对的性能很差。

我刚刚在我的机器上运行了 test code。它生成 15,000 个点并计算每个点到其余点的距离。

a : [0, 0] - b : [2.14748e+09, 2.14748e+09]

euclideanDist : 3.037e+09
distanceBtwPoints : 3.037e+09
cv::norm : 3.037e+09

max_distance euclideanDist : 3.02456e+09 time passed :0.165179
max_distance distanceBtwPoints : 3.02456e+09 time passed :0.259471
max_distance cv::norm : 3.02456e+09 time passed :0.26728

令人惊讶。最快的代码是

float euclideanDist(cv::Point2f& a, cv::Point2f& b)
{
cv::Point2f diff = a - b;
return cv::sqrt(diff.x*diff.x + diff.y*diff.y);
}

使用 cv::norm(a - b) 和下面的代码几乎相同:

static double distanceBtwPoints(const cv::Point2f &a, const cv::Point2f &b)
{
double xDiff = a.x - b.x;
double yDiff = a.y - b.y;

return std::sqrt((xDiff * xDiff) + (yDiff * yDiff));
}

但这显然是因为转换为 double。如果保留为 floatdistanceBtwPointseucledianDist 一样快。

关于c++ - 使用opencv范数函数获取两点的欧氏距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38365900/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com