OpenCVのモーメントとは正確には何ですか?


ベストアンサー

背景:

モーメントは、力学や統計で一般的に使用される定量的な尺度(記述子)です。 、ポイントのセットの空間分布を記述します。最も単純な用語では、モーメントは、一連のベクトルの集約された測定値を提供する一連のスカラーです。モーメントの定義は、力学、統計、およびコンピュータービジョンのドメイン間で同じです。モーメントのセットは、ベクトルのセットの最も粗い記述から始まり、徐々に高次で始まり、ベクトルのセット内のローカル構造に対してより敏感になり始めます。有用なモーメントの順序の選択は、データ分布と、区別したいベクトルのセットによって異なります。

点が質量を表す場合、0番目のモーメントは総質量であり、最初のモーメントを総質量で割ったものが

重心、2番目のモーメントは回転慣性です。ポイントが確率密度を表す場合、ゼロ番目のモーメントは合計確率です(つまり、 1 )、最初の瞬間は平均、2番目の瞬間は分散、3番目の瞬間は瞬間は歪度であり、4番目の瞬間(正規化とシフトあり)は尖度です。 。 [ウィキペディア:モーメント(数学)]

画像のモーメント:

統計と力学のモーメントの概念は、画像を大まかに説明するためにコンピュータービジョンで借用されています。ピクセル強度が I x y )、生の画像モーメントM\_ {ij}は次のように計算されます

M\_ {ij} = \ sum\_ {x} \ sum\_ {y} I(x、y)

、ここでi、jはモーメントの次数です。典型的な画像モーメント計算パイプラインでは、画像I(x、y)は、最初にグレースケール画像を計算し、次にコーナーまたはエッジ検出器を使用して画像を突出点のセットに縮小することにより、ベクトルのセットに変換されます。これらの点の空間分布は、異なる視覚的内容を有する画像が顕著な点の測定可能な異なる空間分布を有するという点で、画像を特徴付ける。画像のさまざまな次数のモーメント(顕著な点のセット)は、画像の質量、重心、主軸などを提供します。

OpenCVのモーメント:

のモーメントの計算例opencvの画像。

Mat src, gray; // opencv matrices for the image and its grayscale

src = imread( "../path/to/image.jpg" , 1 ); // load the image

cvtColor( src, gray, CV\_BGR2GRAY ); // convert to grayscale

vector > contours; // image contour is set of salient points of the image we are interested in

vector hierarchy;

//Detect edges using canny

Canny( gray, canny\_output, 50, 150, 3 ); // canny edges are low-level image structures that are used by contour detector

//Find contours

findContours( canny\_output, contours, hierarchy, CV\_RETR\_TREE, CV\_CHAIN\_APPROX\_SIMPLE, Point(0, 0) );

// Get the moments of image

vector mu(contours.size() );

for ( int i = 0; i < contours.size(); i++ )

{ mu[i] = moments( contours[i], false ); }

//Get the mass centers (image has multiple contours):

vector mc( contours.size() );

for ( int i = 0; i < contours.size(); i++ )

{ mc[i] = Point2f( mu[i].m10/mu[i].m00 , mu[i].m01/mu[i].m00 ); } // compute the centers of mass of each contour in the image

この例では、画像のセントロイドモーメントは、画像内の複数のオブジェクトの位置を見つけるのに役立ちます。画像に複数の人物が含まれていて(背景の乱雑さの問題が解決されていると仮定)、各人物のおおよその位置に関心がある場合は、重心モーメントが適切な解決策です。

同様のシナリオを想像できます。高次のモーメントが関連するようになります。たとえば、車の追跡では、車の向きと位置の両方を、重心、分散、向きの軸の画像モーメントで簡単に表すことができます。

回答

OpenCVについて尋ねた質問は、一般的なコンピュータービジョンにも当てはまります。部屋の中の人を95〜100%の精度で検出できますか?

答えは多くの要因によって異なります:

シナリオ1: 部屋の中には15人がいて、カメラに向かって適切な位置に座っています。それらのすべてがはっきりと見え、誰も閉塞されていません。照明は明るく均一です。カメラは適度に優れています。

確かに、このような場合は99%を超える精度を実現できます。OpenCVであろうと他のディープラーニングライブラリであろうと、あなたは安全な海にいます。このようなシステムの構築は、通常の高校のプロジェクトほど難しくも困難でもありません。

シナリオ2: 部屋の中には15人がいて、カメラに向かって適切な位置に座っています。それらのいくつかは互いに閉塞します。照明の品質についての保証はありません。それらのいくつかは、非標準の眼鏡、帽子、または奇妙な化粧をしている可能性があります。カメラはまだかなり良いです。

これは少しトリッキーになり始めます。このような場合、OpenCVでは99%を超える精度が得られない場合があります。 TensorFlowまたはその他のディープラーニングアーキテクチャは引き続き機能する可能性があります。 Facebookは、このようなシナリオで定期的に人々を識別してタグ付けします。それらは100%正確ですか?場合によります。私たちが自由に使えるすべてのオープンソースライブラリを使用してそのようなシステムを構築することは簡単ではないかもしれません。しかし、それもそれほど難しいことではありません。少しの努力と運があれば、95%以上を達成できる可能性があります。

シナリオ2: 部屋の中には15人がいて、適切な位置に座っていますが、必ずしもカメラの方を向いているとは限りません。それらのいくつかは互いに閉塞します。照明はくだらないです。画像内の人物を露出不足または露出過剰にする傾向があります。それらのいくつかは、非標準の眼鏡、帽子、または奇妙な化粧をしている可能性があります。このカメラは15年前のVGAWebカメラです。

現在、使用するツールに関係なく、精度についての保証はありません。この問題は現在、研究プロジェクトになることに国境を接しています。

あなたの質問に対する答えは、どのシナリオに対処しようとしているかによって異なります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です