OpenCV - 计算两组4点矩形框的相交
Posted SpikeKing
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV - 计算两组4点矩形框的相交相关的知识,希望对你有一定的参考价值。
一般而言,计算bbox[x_min, y_min, x_max, y_max]的相交比较简单,但是,计算4点的矩形框,则相对比较复杂,流程如下:
- 通过fillPoly,绘制矩形的多边形区域,获取两个0-1的mask;
- 两个mask相乘,就是相交区域;
- 获取相交区域的contours;
- 从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:
mask2:
相交区域:
以上是关于OpenCV - 计算两组4点矩形框的相交的主要内容,如果未能解决你的问题,请参考以下文章
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