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
)的嵌入式解决方案。