我是靠谱客的博主 柔弱大船,最近开发中收集的这篇文章主要介绍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点矩形框的相交的全部内容,希望文章能够帮你解决OpenCV - 计算两组4点矩形框的相交所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部