python 判断矩形是否有相交

最近在进行图像处理,需要对矩形A[i]和矩形B[j]进行是否相交的判断,如果有相交则显示矩形B[j],无相交的部分只显示矩形A[i](i,j=0,1,2,…,n)
实现如下:

矩形相交

如果存在以下两个矩形A和B,我们分别知道矩形A与矩形B左上角和右下角的坐标在这里插入图片描述
计算A、B左上角坐标的最大值M=(max(Ax1,Bx1),max(Ay1,By1)(图片中M就等于矩形B的左上角坐标(Bx1,By1));
A、B右下角坐标的最小值N=(min(Ax2,Bx2),min(Ay2,By2))(图片中N就等于矩形A的右下角坐标(Ax2,Ay2));
如果A和B相交那么N横纵坐标小于M,即M[0]<N[0],M[1]<N[1]。
在这里插入图片描述

具体代码实现

import cv2
from matplotlib import pyplot as plt
# 读取白色图片,在此图片上绘制矩形
imgA = cv2.imread('img/white.png')
# 绘制结果图
imgB = imgA.copy()
# 矩形A的坐标点loc1左上角坐标,loc2右下角坐标
loc1 = [(10,20),(70,120),(100,110),(120,200),(230,20),(290,160)]
loc2 = [(70,60),(90,170),(130,170),(200,280),(270,120),(320,240)]
# 矩形B的坐标点locX左上角坐标,locY右下角坐标
locx = [(40,40),(50,160),(200,30),(190,70),(300,170),(310,20)]
locy = [(100,100),(170,180),(250,50),(250,90),(330,230),(350,70)]


for k in range(0,5):
    x1 = loc1[k]
    y1 = loc2[k]
    #画出A下的矩形
    cv2.rectangle(imgA, x1, y1, (0,0,255), 2)

    flag = 0
    for l in range(0,6):
        x2 = locx[l]
        y2 = locy[l]
        #画出B下的矩形
        cv2.rectangle(imgA, x2, y2, (255, 0, 0), 2)
        #计算AB左上角最大值坐标M和右下角最小值坐标N
        Xmax = max(loc1[k][0], locx[l][0])
        Ymax = max(loc1[k][1], locx[l][1])
        M = (Xmax, Ymax)
        Xmin = min(loc2[k][0], locy[l][0])
        Ymin = min(loc2[k][1], locy[l][1])
        N = (Xmin, Ymin)
        # 判断是否相交,相交绘制B蓝色矩形
        if M[0]<N[0] and M[1]<N[1]:
            cv2.rectangle(imgB, locx[l], locy[l], (255, 0, 0), 2)
            flag = 1
    # 不相交绘制A红色矩形
    if flag == 0:
        cv2.rectangle(imgB, loc1[k], loc2[k], (0, 0, 255), 2)

#显示结果图
plt.subplot(1, 2, 1), plt.imshow(cv2.cvtColor(imgA, cv2.COLOR_BGR2RGB)), plt.title('A&B'), plt.xticks([]), plt.yticks([])
plt.subplot(1, 2, 2), plt.imshow(cv2.cvtColor(imgB, cv2.COLOR_BGR2RGB)), plt.title('Answer'), plt.xticks([]), plt.yticks([])
plt.show()

输出结果如下

红色矩形为A[i],蓝色矩形为B[j],有交集的部分显示B[j],无交集则显示A[i]。
在这里插入图片描述

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rena要努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值