1

白いピクセルの雲の最小面積 rect ( cv2.minAreaRect() ) を見つける必要があります。

画像に複数の白いオブジェクトがあり、それらの周りに四角形を描きたいです。

私はC ++で解決策を見つけました:

cv::cvtColor(img, gray, CV_BGR2GRAY);
std::vector<cv::Point> points;
cv::Mat_<uchar>::iterator it = gray.begin<uchar>();
cv::Mat_<uchar>::iterator end = gray.end<uchar>();
for (; it != end; ++it)
{
    if (*it) points.push_back(it.pos());
}
cv::RotatedRect box = cv::minAreaRect(cv::Mat(points));

これはPythonでの私の試みです:

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (5 ,5), 0)
retval, thresh = cv2.threshold(gray, 210, 255, cv2.THRESH_BINARY)
whitep = []
for y, row in enumerate(thresh):
    for x, px in enumerate(row):
        if px == 255:
            whitep.append((y, x))
box = cv2.minAreaRect(whitep)

しかし、それは機能しません:

box = cv2.minAreaRect(whitep)
TypeError: <unknown> is not a numpy array

どのようにできるのか?ありがとう

4

2 に答える 2

4

の python ドキュメントminAreaRectは誤解を招くものです。

使用する:

box = cv2.minAreaRect(numpy.array([whitep], dtype=numpy.int32))

これは、形状 (1,N,2) の配列を minAreaRect に渡します。

デフォルトの整数型が numpy.int64 であるシステムを使用している場合は、dtype を指定する必要があります。明示的であることが最も安全です。

参照: Python を使用して opencv で輪郭領域を確認する

于 2013-01-19T16:31:15.780 に答える
1

これを試すこともできます。minAreaRect は場合によっては失敗しましたが、以下に示す方法は常に機能しました。ただし、PIL を使用します。

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (5 ,5), 0)
retval,thresh = cv2.threshold(gray, 210, 255, cv2.THRESH_BINARY)
mask=Image.fromarray(thresh)
box = mask.getbbox()
于 2020-09-25T03:37:34.877 に答える