真っ白な背景にオブジェクトがある場合、OpenCVがキャプチャされたフレームからオブジェクトを簡単に検出する機能を提供しているかどうかは誰にもわかりませんか?
オブジェクトの角/中心点(長方形)を見つけようとしています。私が現在行っている方法は、力ずく(オブジェクトの画像をスキャンする)であり、正確ではありません。私が知らないフードの下に機能があるかどうか疑問に思っています。
詳細の編集:サイズは小さなソーダとほぼ同じです。カメラはオブジェクトの上に配置され、2D /長方形の雰囲気を与えます。カメラからの方向/角度はランダムであり、コーナーポイントから計算されます。
それは白い背景で、その上にオブジェクトがあります(黒)。ショットの品質は、Logitechウェブカメラから期待するものです。
コーナーポイントを取得したら、中心を計算します。次に、中心点がセンチメートルに変換されます。
私は、これら4つのコーナーをどのように「どのように」取得するかを、私が焦点を当てようとしているのです。この画像でブルートフォースメソッドを見ることができます: Image
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}
彼らがしていることの正確な音訳ではありませんが、それはあなたを助けるはずです。
これがお役に立てば幸いです。モーメント法を使用して、白黒画像の重心を取得します。
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をダウンロードします。
欲しいものを取得するいくつかの方法:
以前のようにコーナーを見つけます-例「CornerHarris」OpenCV関数
画像のしきい値を設定し、重心を計算します- http://www.roborealm.com/help/Center%20of%20Gravity.php を参照してください...これは私が使用する方法です。 COGルーチンでしきい値設定を実行することもできます。つまり、cog_x + = * imagePtr <128? 255:0;
画像のモーメントを見つけて、回転、重心などを与えます-例「モーメント」OpenCV関数。 (私はこれを使用していません)
(編集)AForge.NETライブラリには、コーナー検出機能、サンプルプロジェクト(MotionDetector)、およびWebカメラに接続するためのライブラリがあります。 Windowsと.NETを使用している場合、これが最も簡単な方法だと思います。
通常、他のマシンビジョンライブラリではblob分析と呼ばれます。私はまだopencvを使用していません。