1

等高線 ( cnt) の (x,y) ポイントがあります。findContoursデータ構造を戻り値 ( )のデータ構造と比較すると、contoureほとんど同じように見えるリストが作成されました。 cntは 3D 配列のリストで、 は 3D 配列contoureのリストです。

次の結果が得られます。

len(cnt) = 140
len(contoure) = 140

cnt.shape = (20L,1L,2L)
contoure.shape = (20L,1L,2L)

np.size(cnt,0) = 140
np.size(contoure,0) = 140

np.size(cnt) = 5600
np.size(contoure) = 140

「範囲外のタプルインデックス」を取得する理由がわかりません(これは 3D 配列np.size(contoure,1)であることに注意してください!) 。contoure[i]np.size(cnt,1)np.size(cnt) != np.size(contoure)

この違いのためにdrawContours が機能しないとcnt思いますが、なぜこれが起こるのかわかりません。

編集: 輪郭は findContours() 呼び出しによって作成されます。友人がコードのその部分をプログラムしたため、cnt がどのように作成されるか正確にはわかりません。結果は次の形式でしか得られません: all_cnt:

x11 x12 ... x1n
y11 y12 ... y1n
.
.
xm1 xm2 ... xmn
ym1 ym2 ... ymn

ここで、x1、y1 は最初の輪郭を表す n ペアです。次のコードを使用するよりも:

cnt=[]

for i in range(140):
    a=all_cnt[2*i:2*i+2]
    a = np.reshape(np.ravel(a,order='F'),(20,1,2))
    cnt.append(a)
4

1 に答える 1

0

問題は、輪郭のリスト内の 3D 配列が int32 型でなければならないことです。私の場合、all_cnt を all_cnt.astype(np.int32) として定義する必要がありました。

findContours を使用しておらず、drawContours() を使用したい場合、contours パラメータは次のようになります: list(array,array,...)、ここで、配列の dtype は int32 で、各配列は次のようになります: [ [ [x1, y1] ], [ [x2, y2] ], [ [x3, y3] ], [ [x4, y4] ], ... ]. 各配列には、1 つのオブジェクトの境界点が含まれます。

于 2014-10-22T16:16:26.283 に答える