私は画像処理とロボット工学のセルフプロジェクトに取り組んでおり、代わりにロボットが通常のように色を検出してオブジェクトを選び出し、ボード上の穴 (異なるポリゴンに似ている) を検出しようとします。セットアップをよりよく理解するために、次の画像をご覧ください。
ご覧のとおり、これらの穴を検出し、その形状を調べてから、ロボットを使用してオブジェクトを穴にはめ込む必要があります。深度画像を取得するためにkinect深度カメラを使用しています。写真を以下に示します。
カメラで穴を検出する方法を考えていませんでした。最初はマスキングを使用して、深度測定に基づいて背景部分と前景部分の一部を削除しましたが、これはうまくいきませんでした。穴はボードと合体します...範囲内のようなものです(完全に白くなります)。adaptiveThreshold
それから私は機能に出くわしました
adaptiveThreshold(depth1,depth3,255,ADAPTIVE_THRESH_GAUSSIAN_C,THRESH_BINARY,7,-1.0);
浸食、膨張、およびガウスぼかしを使用したノイズ除去。下の写真に示すように、より良い方法で穴を検出しました。次に、cvCanny エッジ検出器を使用してエッジを取得しましたが、これまでのところ、下の図に示すようにうまくいきませんでした。その後、SIFT、SURF、ORB、GoodFeaturesToTrack からさまざまな機能検出器を試したところ、ORB が最高であることがわかりました。時間と検出された機能。この後、クエリ画像の相対的なカメラ ポーズを取得しようとしました。そのキーポイントを見つけ、それらのキーポイントを一致させて、findHomography
関数に適切な一致を与えるようにしました。結果は、図のように次のようになります。
最後に、2 つの画像間の相対的なカメラ ポーズを取得し、solvePnP 関数から取得した回転および並進ベクトルを使用してロボットをその位置に移動します。
キーポイントの検出とマッチングのために検出された穴の品質を改善できる他の方法はありますか?
輪郭検出と approxPolyDP も試しましたが、近似形状はあまり良くありません。
しきい値とキャニー関数の入力パラメーターを微調整しようとしましたが、これは私が得ることができる最高のものです
また、カメラのポーズを正しくするための私のアプローチは正しいですか?
更新: 何を試しても、再現性のある優れた機能をマップすることができませんでした。次に、深度画像は解像度が低く、マスキングや距離の取得などにのみ使用されることをオンラインで読みました。そのため、エッジが乱雑な低解像度の画像のために、機能が適切ではないことがわかりました。そこで、RGB 画像の特徴を検出し、深度画像を使用してそれらの特徴の距離のみを取得することを考えました。私が得た機能の品質は、文字通りチャートから外れていました.ボード上のネジも検出しました!! GoodFeaturesToTrack キーポイント検出を使用して検出されたキーポイントは次のとおりです。. ポイントの距離がうまく出ず、距離をとっていくうちにまたハードルにぶつかりました。考えられる原因を検索したところ、カメラ間のオフセットが原因で、RGB 画像と深度画像にオフセットがあることがしばらくしてわかりました。これは、最初の 2 つの画像から確認できます。次に、このオフセットを補正する方法についてネットを検索しましたが、有効な解決策が見つかりませんでした。
あなたの誰かがオフセットを補うのを手伝ってくれるなら、それは素晴らしいことです!
更新: goodFeaturesToTrack 関数をうまく利用できませんでした。この関数は、Point2f タイプのコーナーを提供します。記述子を計算する場合は、キーポイントが必要です。以下のコード スニペットを使用して Point2f を Keypoint に変換すると、スケールと回転の不変性が失われます。
for( size_t i = 0; i < corners1.size(); i++ )
{
keypoints_1.push_back(KeyPoint(corners1[i], 1.f));
}
特徴マッチングの恐ろしい結果を以下に示します。
今すぐさまざまな機能のマッチングを開始する必要があります。さらに更新を投稿します。誰かがオフセットの問題を取り除くのを手伝ってくれると本当に助かります.