0

「1.pngの輪郭は1つだけです」

img = cv2.imread('1.png')

retval,dst = cv2.threshold(img,120,255,cv2.THRESH_BINARY)

contours, hierarchy = cv2.findContours(dst,cv2.RETR_EXTERANL,cv2.CHAIN_APPROX_SIMPLE)

print cv2.contourArea(contours[0],False) 

画像には輪郭が1つだけあり、輪郭はリストです。または他の番号に変更contours[0]してcontours[3]も、まだ領域があります。私はその質問について何も考えていません。ただ一つの輪郭です。

なぜこれほど多くの値が表示されるのですか?見つかったスレッシュの問題ですか?君の力が必要?

4

1 に答える 1

1

問題は、OpenCV が輪郭と見なすものは、輪郭と見なされるものの一部にすぎないことです。言い換えれば、OpenCV は輪郭をバラバラに分割しています。個々の等高線の領域を追加することで全領域を取得できる可能性がありますが、この方法は信頼できません。

あなたが試すことができるのはImage Morphologyです。これを使用すると、輪郭を「成長」させて、より重なるようにすることができます。これは、OpenCV がそれらを単一の輪郭として認識する可能性が高くなることを意味します。

ただし、この方法では精度が低下します。したがって、正確な領域が必要な場合は、他の方法に頼る必要があります。複雑なジオメトリの場合、これは単純な作業ではありません。

私が使用したもう 1 つの「手っ取り早い」ソリューションは、新しい 1 チャネルのマ​​ットを作成し ( Mat::zeros)、カラー値 255 で塗りつぶされた輪郭を描画し ( )、内容を合計することですdrawContours(C++ では、これはだと思います) 、結果を 255 で割ります。これにより、領域がピクセル単位で取得され、個々の等高線の領域を合計するよりも信頼性が高くなります。cv::sumcv2.sum

于 2013-03-06T01:29:03.827 に答える