2016-12-27 22 views
3

私はここに示すように、ルートを取ることなく乗ユークリッドノルムcv::NORM_L2SQRを使用しようとOpenCVのは、CVのためのノルムを二乗:: 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の場合でも "No matching function'を得た – Slowpoke

+2

私はあなたに過大な負荷がかかっていると思いますが、単純なC++の代わりにOpenCVの実装を使用すると大きなパフォーマンスの向上は見られません単純な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);

おそらく)(STDする::複合たPoint2D変換とstd ::ノルムを使用するより思慮あります。

cv::Point2d diff = a0 - b0; 
std::norm(std::complex<double>(diff.x, diff.y)); 
関連する問題