web-dev-qa-db-ja.com

OpenCV findContours in python

私はopenCV3.0のpythonで作業しています。最大の白いピクセル領域を見つけるために、まず最初にしきい値処理されたグレー画像からバイナリ画像へ。

import cv2

import numpy as np

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

img = cv2.resize(img,(400,500))

gray = img.copy()

(thresh, im_bw) = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY )

derp,contours,hierarchy = cv2.findContours(im_bw,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

cnts = max(cnts, key=cv2.contourArea)

ただし、次のようなエラーが表示されます。

cv2.error:..../opencv/modules/imgproc/src/contours.cpp:198:エラー:(-210)[Start] FindContoursは、モード!= CV_RETR_FLOODFILLの場合、CV_8UC1画像のみをサポートします。それ以外の場合は、関数cvStartFindContoursでのみCV_32SC1画像をサポートします。 。

10
Kaira

これはコメントで回答されたようですが、質問に回答済みのマークを付けるためだけです。

CV_8UC1は、8ビットピクセル、符号なし、および1つのチャネルのみを意味するため、グレースケールです。 3つのカラーチャンネル、つまりCV_8UC3で読んでいるようです。 _img.dtype_と_img.shape_を印刷すると、画像の種類を確認できます。 dtypeはuint8で、形状は(#、#)で、2次元を示している必要があります。画像のシェイププリント(#、#、3)がそのまま表示され、3つのカラーチャネルを示していると思います。

@ user3515225が言ったように、cv2.imread('img.png', cv2.IMREAD_GRAYSCALE)を使用して画像をグレースケールとして読み取ることで、これを修正できます。ただし、他の場所では色を使用できないことを前提としています。画像の別のグレースケールcopyが必要な場合は、代わりにgray = img.copy()gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)に置き換えます。

2
DirtBird