モブ沢工房

プログラミングとかLinux関連(特にOSSのグラフィックツール関連)とかレトロゲームとか3Dプリンタやら日曜大工等、色々。

python-OpenCV2のfillPolyで苦労した話

python-opencv2にて、普通に [[x1, y1], [x2, y2], [x3, y3] ....] 的な配列を突っ込んだら、np.int32だろうが何だろうが以下のエラーが出続けた話。

OpenCV Error: Assertion failed (p.checkVector(2, CV_32S) >= 0) in fillPoly, file /build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/imgproc/src/drawing.cpp, line 2373

ググってたどり着いたのはやはりstackoverflow、本当に有り難い…のだけど、既に閉じてしまって今検索しても何故か見つからない。悲しい (`;ω;´)

そんなわけで書いておきますが要するにreshapeして

[ [[x1, y1] ], [ [x2, y2]], [[x3, y3]] ... ] 

のような超変な形に変えて、しかもfillPolyのptsに与えるやつをlistでくくる*1。これで動きました。

以下、動いたコードをコピペ

        pix = 255
        buf = np.zeros(bufshape, 'uint8')
        points = np.array(points).reshape((-1,1,2)).astype(np.int32)
        cv2.fillPoly(buf, pts=[points], color=pix)

このくだらねー処理に、何時間費やしたことか…

*1:これをしないと、Assertionは出なくなるがポリゴンフィルはされずに点だけ描画される