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

Posted SpikeKing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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:
mask1

mask2:
mask1
相交区域:
在这里插入图片描述

以上是关于OpenCV - 计算两组4点矩形框的相交的主要内容,如果未能解决你的问题,请参考以下文章

C++编程,求俩矩形重叠面积的代码

计算几何

Save Money for Your Company 最小矩形覆盖(非计算几何)/找出N条直线相交点的边缘点/ find the dominating points of N lines

Save Money for Your Company 最小矩形覆盖(非计算几何)/找出N条直线相交点的边缘点/ find the dominating points of N lines

opencv 矩形检测与计数

opencv 矩形检测与计数