我尝试使用平方的欧几里德范数cv::NORM_L2SQR
而没有生根,如图所示
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);
}
答案 0 :(得分:0)
必须显式构造一个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 ) );