OpenCV - 计算两组4点矩形框的相交

一般而言,计算bbox[x_min, y_min, x_max, y_max]的相交比较简单,但是,计算4点的矩形框,则相对比较复杂,流程如下:

  1. 通过fillPoly,绘制矩形的多边形区域,获取两个0-1的mask;
  2. 两个mask相乘,就是相交区域;
  3. 获取相交区域的contours;
  4. 从contours提取4点矩形,面积过滤较小区域、获取最小矩形、转换为4点。

代码如下:

def intersect_of_rec_boxes(h, w, rec_boxes1, rec_boxes2):
    """
    4点的rec矩形框求交
    img_bgr: 图像, h是高度, w是宽度
    rec_boxes1: 4点框1
    rec_boxes2: 4点框2
    """
    # h, w, _ = img_bgr.shape

    img_mask1 = np.zeros((h, w))
    for rb1 in rec_boxes1:
        rec_arr = np.array(rb1).astype(np.int32)
        img_mask1 = cv2.fillPoly(img_mask1, [rec_arr], 1)
    img_mask1 = img_mask1.astype(np.uint8)

    img_mask2 = np.zeros((h, w))
    for rb2 in rec_boxes2:
        rec_arr = np.array(rb2).astype(np.int32)
        img_mask2 = cv2.fillPoly(img_mask2, [rec_arr], 1)
    img_mask2 = img_mask2.astype(np.uint8)

    masked = img_mask1*img_mask2  # 图像相交
    masked = masked.astype(np.uint8)

    contours, hierarchy = cv2.findContours(masked, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    out_rec_boxes = []  # 输出也是4点矩形
    for cnt in contours:
        # x, y, w, h = cv2.boundingRect(cnt)  # 直接获取2点框
        area = cv2.contourArea(cnt)
        r = float(area) / float(h*w)  # 计算面积比
        if r < 0.0001:  # 过滤较小的矩形
            continue
        rect = cv2.minAreaRect(cnt)  # 矩形,中点、半径、角度
        pnt_rect = cv2.boxPoints(rect)  # 4点矩形框
        out_rec_boxes.append(pnt_rect.astype(np.int))

    return out_rec_boxes

示例效果:

mask1:
OpenCV - 计算两组4点矩形框的相交_第1张图片

mask2:
OpenCV - 计算两组4点矩形框的相交_第2张图片
相交区域:
OpenCV - 计算两组4点矩形框的相交_第3张图片

你可能感兴趣的:(OpenCV - 计算两组4点矩形框的相交)