私は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画像をサポートします。 。
これはコメントで回答されたようですが、質問に回答済みのマークを付けるためだけです。
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)
に置き換えます。