找到opencv(python)中设置的白色像素的边界框

时间:2013-01-19 15:26:07

标签: python opencv

我需要为白色像素云找到最小区域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

我该怎么办? 感谢

2 个答案:

答案 0 :(得分:2)

minAreaRect的python文档具有误导性。

使用:

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

这会将形状(1,N,2)的数组传递给minAreaRect。

如果您使用的是默认整数类型为numpy.int64的系统,则需要指定dtype。明确是最安全的。

另请参阅:Checking contour area in opencv using python

答案 1 :(得分: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()