我尝试使用平方欧氏范数 cv::NORM_L2SQR
没有 Root ,如图所示
Does OpenCV offer a squared norm function for cv::Point?
节省计算资源。因此,虽然以下代码有效:
// works fine
cv::Point2d a(1.5, 3);
cv::Point2d b(5.1, 6);
//Euclidean distance
//http://answers.opencv.org/question/14188
double res = cv::norm(a-b);
以下不是:
double res = cv::norm(a-b,cv::NORM_L2SQR);
( error: no matching function for call to norm(cv::Point_<double>, cv::NormTypes)
)
我可以在 OpenCV 3.1 中做什么来使用优化的解决方案?
编辑:我现在正在使用自定义函数并希望编译器以某种方式优化它:
double euclideanDist(cv::Point2d& p, cv::Point2d& q) {
cv::Point2d diff = p - q;
return (diff.x*diff.x + diff.y*diff.y);
}
最佳答案
必须显式构造一个 InputArray 容器(例如矩阵)以便为非默认参数正确编译:
double res = cv::norm( cv::Mat( a0 - b0 ), cv::NORM_L2SQR );
尽管创建容器对象的成本可能比仅计算范数要慢。
cv::norm( std::vector< cv::Point2d >( 1, a0 - b0 ), cv::NORM_L2SQR );
也许将 Point2d 转换为 std::complex 并使用 std::norm() 更周到。
cv::Point2d diff = a0 - b0;
std::norm( std::complex< double >( diff.x, diff.y ) );
关于c++ - cv::Point2d 的 OpenCV 平方范数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41352530/