1

次の例のコインを C で python に変換してカウントしたい python プログラムに問題があります。

コインの輪郭

これまでのところ、C 行に相当するものを見つけることができませんでした。

sprintf(msg, "Found %d coins.", contours.size());

私の主な問題は「contours.size()」にあります。そのコードを len() に置き換えようとしましたが、4 ではなく 154 という数値が返されました。以下のコードを参照してください。

contours = cv.FindContours(cv.CloneImage(image_threshed), cv.CreateMemStorage(0), cv.CV_RETR_LIST, cv.CV_CHAIN_APPROX_SIMPLE)

cv.DrawContours(image, contours, cv.RGB(255,0,0), cv.RGB(0,255,55), 2,1,8)

NumeroContornos = str(len(contours))

font = cv.InitFont(cv.CV_FONT_HERSHEY_SIMPLEX, .5, .5, 0, 1, 8)
cv.PutText(image,NumeroContornos, (5,17),font, cv.RGB(250,0,0))

助けていただければ幸いです。

4

1 に答える 1

2

cv.FindContours 関数を使用して輪郭を見つけると、cvSeq オブジェクトが返されます。複数のリンクされたシーケンスが返されるため、それらを繰り返し処理してすべての輪郭を取得する必要があります。

したがって、最初は、ポインターは最初の輪郭のみを指します。たとえば、最初のコインとします。を使用するlen(contour)と、その輪郭内のポイントのみが返されます。つまり、最初のコインのポイントです。これで 154 になったことが想像できます。これは等高線の数ではなく、その等高線内の点の数です。これらの点を確認するには、print list(contour)これらの点を画像に描画すると、すべてがコインの境界を構成することがわかります。

次の輪郭または次のコインを選択するには、などを使用contour = contour.h_next()します。

輪郭を繰り返して数えることを除いて、輪郭の数を返す組み込み関数はないと思います。

これを試して、4 つの cvSeq オブジェクトが表示されるかどうかを確認してください。

while contours:
    print contours
    contours = contours.h_next()

ここでこれらすべてを説明しました:「リスト(輪郭)」の結果は何を意味しますか?

代わりに、cv2よりシンプルで優れた新しいインターフェイスを使用することをお勧めします。そこでは、輪郭が Numpy 配列のリストとして返され、len(contour) を使用して輪郭の数を見つけることができます。

ここで cv と cv2 の違いの簡単な説明を見つけることができます: What is different between all these OpenCV Python interfaces?

古いcvインターフェイスはすぐに廃止されます。cv2したがって、新しいインターフェースに移行することをお勧めします。

于 2012-12-16T22:18:14.180 に答える