通过IOU来简单判断两个坐标是否是指向同一个目标

业务场景

一张抓拍图片中有多个个目标,一个主目标,多个关联目标。
在这里插入图片描述
前端智能设备在检测目标时,由于设备软件设计或者检测算法局限性,同一张抓拍图片中的多个目标不会关联性的通知给后端服务。这样后端业务如果想实现主目标对应哪些关联目标的话,就不好实现。
为此需要在后端通过智能检测算法,再次对抓拍图片中的目标进行检测并记录检测目标和关联目标的坐标位置。

约束

由于前后端检测算法不一样,会导致对抓拍图片中主目标坐标检测有细微的出入。如何确定抓拍图片中哪个是主目标,哪些是关联目标,则是后端需要解决的问题。

知识点

通过查资料发现做目标检测中有个IOU的概念可以解决上述业务需求。
所谓的IOU(intersect over union)叫:交并比。指目标预测框和真实框的交集和并集的比例。
在这里插入图片描述
在这里插入图片描述

IOU = A与B的交集面积 / A的面积 + B的面积 - A与B交集的面积。

如果坐标完全重合,那IOU就是1,一般算法测试的数据集结果中如果IOU >= 0.5 就可以表示两个坐标指向相同的目标了。
更详细的关于IOU的知识可自行去查,此处不深究。

实现

先看个图,目标矩阵A和目标矩阵B。
在这里插入图片描述
我们分别用p1与p2表示矩形A的左下角和右上角,用p3和p4表示矩形B的左下角和右上角。考虑两个矩形不重叠的情况:

         (p1.x > p4.x) || (p2.x < p3.x) || (p1.y > p4.y) || (p2.y < p3.y)

伪代码:

struct RectAnale{
    int x    //X坐标
    int y;   /Y坐标
    int w;   //矩形宽
    int h;   //矩形高
};    

int calculateOverlapArea(RectAnale rect1, RectAnale rect2) 
{
    //1.判断下坐标的合法值
    
    //2.计算交集面积
    int p1_x = rect1.x, p1_y = rect1.y;//第1个矩阵左下角
    int p2_x = p1_x + rect1.h, p2_y = p1_y + rect1.w;//第1个矩阵右上角
    int p3_x = rect2.x, p3_y = rect2.y;//第2个矩阵左下角
    int p4_x = p3_x + rect2.h, p4_y = p3_y + rect2.w;//第2个矩阵右上角
    
    //2-1.矩形若不相交,面积则为0
    if (p1_x > p4_x || p2_x < p3_x || p1_y > p4_y || p2_y < p3_y) 
    {
       return 0;
    }
    //长 = 右上角最小x - 左下角最大x
    //宽 = 右上角最小y - 左下角最大y
    int Len = min(p2_x, p4_x) - max(p1_x, p3_x);
    int Wid = min(p2_y, p4_y) - max(p1_y, p3_y);
    return Len * Wid;
}

int iou()
{
     RectAnale rect1;
     RectAnale rect2;
     
     int nOverlapArea = calculateOverlapArea(rect1, rect2);
     
     if(nOverlapArea = 0)
     {
         return 0
     }
     
     int nIOU = nOverlapArea  / (rect1.h*rect1.w + rect2.h*rect1.w - nOverlapArea);
     
     return  nIOU;        
}

参考:
https://blog.csdn.net/qq_31758759/article/details/83024574

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值