我需要找到白色像素云的最小面积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));
this is my try in 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
我该怎么办?由于
minAreaRect
的python文档具有误导性。
使用:
box = cv2.minAreaRect(numpy.array([whitep], dtype=numpy.int32))
传递一个形状为(1,N,2)的数组给minAreaRect。
如果您使用的系统的默认整数类型是numpy.int64,则需要指定dtype。显式是最安全的。
参见:使用python检查opencv中的轮廓区域
您也可以试试这个。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()