8

これは画像の例です:

スクリーンショット

そして、opencv を使用して輪郭を検出します。

>>> fc = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
>>> contours = fc[0]

閉じた輪郭を検出するために、opencv によって返された各輪郭の開始点と終了点を確認することを考えましたが、オブジェクトの形状に関係なく、opencv が各オブジェクトの輪郭を描いているように見えることに気付きました。次の結果が得られます。

>>> for contour in contours:
>>>    print(contour[0,:,:], contour[-1,:,:])
[[246  38]] [[247  38]]
[[92 33]] [[93 33]]

または、見つかった各輪郭がパスを閉じています。

関数で使用可能なメソッドへの追加の定数を検索しましfindContour()たが、すべて閉じたパスを返すようです。

見つかった輪郭が閉じているかどうかを検出する一般的な方法はありますか?


質問する前にグーグルで検索しましたが、結果は得られませんでしたが、右側の同様の質問に適切な候補が表示されます: opencv で輪郭が開いているか閉じているかを知るにはどうすればよいですか? を使用することをお勧めしますcv2.isContourConvex(contour)が、次のとおりです。

>>> for contour in contours:
>>>    print(cv2.isContourConvex(contour))
False
False

さらに別の更新:contourAreaは(少なくとも単純な輪郭の場合)答えを提供するように見えますが、上記の例の画像以外ではテストしませんでした:

>>> for contour in contours:
>>>     print(cv2.contourArea(contour))
0.0
12437.5
4

4 に答える 4

0

閉じた輪郭は、定義により、別個の内部輪郭を持ちます。の引数を
見てください:hierarchyfindContours()

hierarchy – イメージ トポロジに関する情報を含むオプションの出力ベクトル。等高線の数と同じ数の要素があります。i 番目の輪郭のそれぞれについて、要素 hierarchy[i][0] 、 hiarchy i、 hiearchy[i][2] 、および hiarchy[i][3] は、次の輪郭の 0 ベースのインデックスに設定されます。同じ階層レベルの次の輪郭と前の輪郭、それぞれ最初の子輪郭と親輪郭。輪郭 i に次、前、親、またはネストされた輪郭がない場合、hierarchy[i] の対応する要素は負になります。

于 2013-07-05T06:39:14.997 に答える
0

これは正確にはpythonの答えではなく、おそらく遅すぎます。Emgu での私の経験から、面積がゼロの輪郭は閉じていません。追加のチェックとして、領域とその周囲を比較することもできます。領域が非常に小さい場合は、間違いなく閉じていません。不規則な形状には、輪郭に沿ったどこかに小さな閉じた領域がある場合があります。

等高線面積はから取得できます

cvContourArea

Emgu の等高線は次のように定義されます。

cvArcLength(contour, CV_WHOLE_SEQ, 1);
于 2015-10-10T06:04:06.573 に答える