C++ cv::Point2d的OpenCV平方范数

C++ cv::Point2d的OpenCV平方范数,c++,opencv,C++,Opencv,我尝试使用平方欧几里德范数cv::norm_L2SQR,而不求根,如下所示 以节省计算资源。因此,尽管以下代码有效: // 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,c

我尝试使用平方欧几里德范数
cv::norm_L2SQR
,而不求根,如下所示

以节省计算资源。因此,尽管以下代码有效:

// 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);
错误:调用norm(cv::Point,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(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 ) );
cv::Point2d diff=a0-b0;
标准:标准(标准:复杂<双>(差x,差y));

似乎只接受点2f(点2;)。我应该再检查一下,though@Miki没有,我得到“<代码>没有匹配函数< /代码>”,即使对于PooT2Fi,你也猜到了它的过度使用,对于使用OpenCV实现而不是简单的EQDIST方法的C++ C++内嵌定义,我似乎没有巨大的性能改进,您可以阅读注释:为了验证我的假设,我检查了。最简单、最有效的解决方案是编写自己的函数,如
euclideanDist
。稍后我可能会写一个答案解释原因(但我现在没有足够的时间…)。底线:@ZdaR是right@ZdaR,@Miki嗯,我已经检查了评论-也许你是对的,如果没有性能改进,那就随它去吧。我对低级计算不太熟悉,所以在处理优化库(如OpenCV)时,我只是尝试使用本机解决方案,尽量不使用循环等。我认为,只要不同
类型的这些函数似乎是模板化的,奇怪的是,没有针对其他规范(如
NORM\u L2SQR
)的嵌入式解决方案。