2016-12-27 25 views
3

我試着用平方歐幾里得範cv::NORM_L2SQR沒有深入人心,如下所示爲CV OpenCV的平方範::的Point2D

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

似乎只有Point2f被接受(Point_ )。我應該仔細檢查,儘管 – Miki

+0

@Miki Nope,即使對於Point2f我也會得到「'無匹配函數」 – Slowpoke

+2

我猜你已經過度使用它了,對於使用OpenCV而不是簡單的C++一個簡單的EqDist方法的內聯定義,您可以閱讀以下評論:http://answers.opencv.org/question/14188/calc-eucliadian-distance-between-two-single-point/?answer=14190#post-id -14190驗證我的假設 – ZdaR

回答

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 ::複雜和使用的std ::範數()是更周到。

cv::Point2d diff = a0 - b0; 
std::norm(std::complex<double>(diff.x, diff.y));