OpenCVオブジェクト検出-中心点
-
07-07-2019 - |
質問
無地の白い背景にオブジェクトがある場合、OpenCVがキャプチャされたフレームからオブジェクトを簡単に検出する機能を提供するかどうかを知っている人はいますか?
オブジェクトの角/中心点(長方形)を見つけようとしています。私が現在行っている方法は、ブルートフォース(オブジェクトの画像をスキャンする)によるものであり、正確ではありません。気付いていない機能がボンネットの下にあるのではないかと思っています。
詳細の編集: 小さなソーダ缶とほぼ同じサイズ。カメラはオブジェクトの上に配置され、2D /長方形の雰囲気を与えます。カメラからの方向/角度はランダムであり、コーナーポイントから計算されます。
これは、白い背景にオブジェクトが置かれているだけです(黒)。ショットの品質は、LogitechのWebカメラから見たものとほぼ同じです。
コーナーポイントを取得したら、中心を計算します。次に、中心点がセンチメートルに変換されます。
これらの4つのコーナーを「どのように」取得するかを改良することは、私が注力しようとしていることです。私のブルートフォースメソッドは、この画像で見ることができます:画像
解決
OpenCVで四角形の検出を行う方法の例は既にあり(samples / squares.cを参照)、実際には非常に簡単です。
使用する大まかなアルゴリズムは次のとおりです。
0. rectangles <- {}
1. image <- load image
2. for every channel:
2.1 image_canny <- apply canny edge detector to this channel
2.2 for threshold in bunch_of_increasing_thresholds:
2.2.1 image_thresholds[threshold] <- apply threshold to this channel
2.3 for each contour found in {image_canny} U image_thresholds:
2.3.1 Approximate contour with polygons
2.3.2 if the approximation has four corners and the angles are close to 90 degrees.
2.3.2.1 rectangles <- rectangles U {contour}
彼らがやっていることの正確な音訳ではありませんが、それはあなたを助けるはずです。
他のヒント
これが役立つことを願って、momentメソッドを使用して白黒画像の重心を取得します。
cv::Point getCentroid(cv::Mat img)
{
cv::Point Coord;
cv::Moments mm = cv::moments(img,false);
double moment10 = mm.m10;
double moment01 = mm.m01;
double moment00 = mm.m00;
Coord.x = int(moment10 / moment00);
Coord.y = int(moment01 / moment00);
return Coord;
}
OpenCVには、これを実現するのに役立つ関数のヒープがあります。その言語でプログラミングしている場合は、ライブラリにラップされたC#.NETのEmgu.CVをダウンロードします。
必要なものを取得するいくつかの方法:
-
以前と同様に角を見つけます-例<!> quot; CornerHarris <!> quot; OpenCV関数
-
画像のしきい値を設定し、重心を計算します- httpを参照してください://www.roborealm.com/help/Center%20of%20Gravity.php ...これは私が使用する方法です。 COGルーチンでしきい値設定を実行することもできます。つまり、cog_x + = * imagePtr <!> lt; 128? 255:0;
-
画像のモーメントを見つけて、回転、重心などを与えます。 <!> quot; Moments <!> quot; OpenCV関数。 (私はこれを使用していません)
-
(編集)AForge.NETライブラリには、コーナー検出機能、サンプルプロジェクト(MotionDetector)、およびWebカメラに接続するためのライブラリがあります。 Windowsと.NETを使用している場合、これが最も簡単な方法だと思います。
通常、他のマシンビジョンライブラリではblob分析と呼ばれます。まだopencvを使用していません。