web-dev-qa-db-ja.com

OpenCV、C ++:2点間の距離

グループプロジェクトでは、プレーヤーがカメラの前で特定の手のジェスチャーのセットを形成するたびに機能が実行されるゲームを作成しようとしています。画像を処理するために、Open-CV 2.3を使用しています。

画像処理中に、2点間の長さを見つけようとしています。これはピタゴラスの法則で非常に簡単にできることはすでにわかっていますが、ピタゴラスの法則は多くのコンピューター能力を必要とすることがわかっており、これをできるだけ少ないリソースで実行したいと考えています。

Open-CVまたはC++の標準ライブラリ内に2つのポイント間の距離の低リソース計算を処理できる組み込み関数が存在するかどうかを確認します。 (もちろん)ピクセル値であるポイントの座標があります。

追加情報:以前の経験から、OpenCVやその他のライブラリは大幅に最適化されていることがわかりました。例として、各ピクセルを通過するforループを使用して、カメラからのライブ画像フィードのRGB値を変更しようとしました。これは低フレームレート出力を備えていました。代わりに、Open-CVビルトイン関数を使用することにしました。これにより、代わりに高いフレームレートの出力が得られました。

15
Marc Pilgaard

あなたが正しく指摘したように、あなたの仕事のいくつかを行うOpenCV関数があります:)

(また、反対の方法をチェックしてください

それは magnitude() と呼ばれ、距離を計算します。そして、あなたが距離を計算するために4つ以上のベクトルのベクトルを持っているなら、それはそれをより速くするためにSSE(私は思う)を使用します。

さて、問題はパワーの2乗のみを計算することであり、手作業で差分を計算する必要があります。 (ドキュメントを確認してください)。しかし、OpenCV関数を使用してそれらを行う場合も、高速になるはずです。

Mat pts1(nPts, 1, CV_8UC2), pts2(nPts, 1, CV_8UC2);
// populate them
Mat diffPts = pts1-pts2;
Mat ptsx, ptsy;
// split your points in x and y vectors. maybe separate them from start
Mat dist;
magnitude(ptsx, ptsy, dist); // voila!

もう1つの方法は、非常に高速なsqrtを使用することです。

// 15 times faster than the classical float sqrt. 
// Reasonably accurate up to root(32500)
// Source: http://supp.iar.com/FilesPublic/SUPPORT/000419/AN-G-002.pdf

unsigned int root(unsigned int x){
    unsigned int a,b;
    b     = x;
    a = x = 0x3f;
    x     = b/x;
    a = x = (x+a)>>1;
    x     = b/x;
    a = x = (x+a)>>1;
    x     = b/x;
    x     = (x+a)>>1;
    return(x);  
}
20
Sam

これを試してみてください

cv::Point a(1, 3);
cv::Point b(5, 6);
double res = cv::norm(a-b);//Euclidian distance
28
Yonatan Simson

これはコメントにすべきですが、担当者(50?)が足りないため、回答として投稿します。

みんながあなたの質問のコメントであなたに伝えようとしていることは、それが比較距離についてのみである場合、単純にd =(dx * dx + dy * dy)=(x1- x2)(x1-x2)+(y1-y2)(y1-y2)したがって、平方根は回避されます。ただし、正方形の標高をスキップすることはできません。

3
kebs

ピタゴラスは最速の方法であり、実際には思ったほど高価ではありません。平方根があるため、以前はそうでした。しかし、最近のプロセッサは通常、これを数サイクルで実行できます。

本当に速度が必要な場合は、グラフィックカードでOpenCLを使用して画像処理を行ってください。

1
Hannesh