1

バイナリ画像から円形状の質量中心を取得したいのですが、出力は複数の質量中心を与えます。画像の瞬間と少し変更したopencv Webチュートリアルドキュメントのコードを使用しています。参考までに、私は c++ API OpenCV を使用しています。

出力は次のとおりです。

AQ38S.jpg

テキスト出力では、3 つの輪郭からおそらく 3 つの重心が得られると思いますが、実際には 7 つの輪郭 (contours[0],...,contours[6]) です。

重心はどれ?または、円形状の輪郭領域はどれですか?

次に、コードを変更し、いくつかの輪郭を削除しました(実際の画像は非常にノイズが多く、特定の輪郭、円の形状を取得したいだけなので、線や文字などの他の輪郭を削除する必要があります)を使用して:

contours.erase()

100 から 500 の間の領域の輪郭から重心を取得したいだけです。

しかし、出力がおかしくなる..

xnDlZ.jpg

重心は、輪郭からどこにでも飛んでいきます。
それでも、5 つの等高線 (contours[0],...,contours[4]) から 5 つの重心が存在します。

どうすればいいですか?円形状の重心のみを取得したい(3以上)。あなたのアドバイスが本当に必要です。どうもありがとう!:D

*下手な英語でごめんなさい..

4

1 に答える 1

0

私がすること:

  1. すべての輪郭を見つけます (そして点のベクトルに格納します) ( cv::findContours)
  2. カスタム パーティクル フィルタを適用します。つまり、輪郭が有効かどうかを示す関数です。そのためには、次のような形態学的特徴に基づいて決定する必要があります。

    • 真円度
    • 凸性
    • アスペクト比

視覚的な例を得るためにそのようなものを見てみましょう: 面積 ( cv::contourArea) と周長 ( )から円形度を計算できますがcv::arcLength、凸面には凸包 ( cv::convexHull) の計算が含まれます。このステップにより、有効な (ei 円形輪郭) のみを含む新しいベクトルが生成されます。

あなたcontourArea(contours[i], false) < 100は良いスタートですが、輪郭が円であるかどうかはわかりません.

その後、新しいベクトルの各要素の重心を計算 (および表示) できます。意味がありますか?

最後に、contours.erase()大きなベクトルには使用しません。繰り返し消去はCPUにとってかなり重い仕事だと思います。代わりに、事前に割り当てられた新しいベクトルに適切な輪郭を格納します。ただし、これは単なるパフォーマンスの詳細です。

于 2013-05-19T17:05:51.683 に答える