概述
一般而言,计算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点矩形框的相交的全部内容,希望文章能够帮你解决OpenCV - 计算两组4点矩形框的相交所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复