【问题标题】:Count non-zero pixels in area rotated rectangle计算区域旋转矩形中的非零像素
【发布时间】:2017-11-11 15:28:17
【问题描述】:

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

【问题讨论】:

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

标签: python-3.x opencv computer-vision


【解决方案1】:
  • 创建与原始图像大小相同的新零值 Mat。
  • 在其上绘制旋转矩形(使用 RotatedRect 顶点填充ConvexPoly)。
  • Bitwise_以及这张带有原始蒙版的图片
  • 在结果图像上应用 findnonzero 函数

您也可以在图像的 ROI 上应用前面的步骤,因为您有旋转矩形的边界框。

【讨论】:

    【解决方案2】:

    根据 Humam 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)
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2021-05-29
        • 1970-01-01
        • 2011-08-12
        • 2011-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多