2017-11-11 238 views
1

我得到一个带有对象和旋转矩形的二进制图像,在cv2.findContourscv2.minAreaRect中找到。图像被标准化为[0; 1] 在边界矩形内计算非零区域的最有效方法是什么?在区域旋转矩形中计算非零像素

Example image

+0

如果您需要更高的性能,请调整drawContours代码来计算像素而不是绘图。 – Micka

回答

2
  • 创建新的零值有原始图像的大小相同垫。
  • 在(fillConvexPoly中使用RotatedRect顶点)在其上绘制旋转的矩形。
  • Bitwise_and与你原来的面具
  • 这个图像应用findnonzero功能结果图像

。您也可申请在图像的ROI前面的步骤,因为你有你的旋转矩形的边框。

2

据,私自Helfawi的答案,我调整了一下建议的步骤,所以下面的代码似乎在做什么,我需要:

rectangles = [(cv2.minAreaRect(cnt)) for cnt in contours] 
for rect in rectangles: 
    rect = cv2.boxPoints(rect) 
    rect = np.int0(rect) 
    coords = cv2.boundingRect(rect) 
    rect[:,0] = rect[:,0] - coords[0] 
    rect[:,1] = rect[:,1] - coords[1] 
    area = cv2.contourArea(rect) 
    zeros = np.zeros((coords[3], coords[2]), np.uint8) 
    cv2.fillConvexPoly(zeros, rect, 255) 
    im = greyscale[coords[1]:coords[1]+coords[3], 
    coords[0]:coords[0]+coords[2]] 
    print(np.sum(cv2.bitwise_and(zeros,im))/255) 
1

contours是一个点的列表。您可以使用cv2.fillConvexPoly在相同尺寸的空白二进制图像上填充此形状,然后使用cv2.countNonZeronumpy.count_nonzero来获取占用像素的数量。