51

opencv の polylines 関数を使用して、画像上に任意の四角形を描画しようとしています。すると、次のエラーが表示されます

OpenCV エラー: ポリラインでアサーションが失敗しました (p.checkVector(2, CV_32S) >= 0)、ファイル /tmp/buildd/ros-fuerte-opencv2-2.4.2-1precise-20130312-1306/modules/core/src/d rawing.cpp、2065 行目

私はそのように関数を呼び出します、

cv2.polylines(img, points, 1, (255,255,255))

ポイントは以下に示すようにnumpy配列です(画像サイズは1280x960です):

[[910 641]
 [206 632]
 [696 488]
 [458 485]]

img は、私が imshow できる通常の画像です。現在、私は自分でこれらのポイント間に線を引いているだけですが、よりエレガントなソリューションを探しています。

このエラーを修正するにはどうすればよいですか?

4

7 に答える 7

73

私の場合の問題は、デフォルトで -bit 番号がnumpy.array作成されたことです。int64したがって、明示的に次のように変換する必要がありましたint32

points = np.array([[910, 641], [206, 632], [696, 488], [458, 485]])
# points.dtype => 'int64'
cv2.polylines(img, np.int32([points]), 1, (255,255,255))

(cv2 python バインディングのバグのように見えます。検証済みである必要がありますdtype)

于 2013-09-15T20:26:10.540 に答える
12

エラーは、配列の次元が 2 でなければならないことを示しています。したがって、次のように配列を再形成します。

points = points.reshape(-1,1,2)

その後、正常に動作します。

また、ジャバルドネドが提供する回答も私にとってはうまくいきます。

于 2013-06-22T07:19:21.787 に答える
1

私も同じ問題に直面しました。解決策は、1 行、2 列、-1 の深さの配列を作成することです。-1 は未知の次元を意味するため、numpy は配列に便利な深さを割り当てます。1 行 2 列を超える配列を作成すると、エラーが表示されます。

また、このエラーは、作成した配列が int32 型ではない場合に発生する可能性があります

Vertices = np.array([[36,86] ,[73,73], [87,87]], dtype=np.int32)
于 2020-04-04T13:52:17.000 に答える
1

に置き換えcv2.fillPoly( im, np.int32(points))ますcv2.fillPoly( im, np.int32([points]))。それが動作します。

于 2019-06-03T11:25:13.007 に答える