目标检测中的候选框的回归修正c++版

目标检测中的候选框的回归修正c++版

简介

在目标检测算法中,都会需要框出目标,其中的实现过程是一个关于候选框的回归,回归以后才能得到更加准确的框的坐标信息,和框的长宽。具体过程可以参考下面给出的源码,每一步都我给出了相应的注释,大家应该能看懂。

源码

typedef struct FaceInfo {
    float score;//置信度
    int x[2];
    int y[2];//框左下和右上的坐标点
    float area;//框的面积
    float regreCoord[4];//4个坐标的修正信息,返回的是框的比例
    int landmark[10];//人脸的5个特征点
} FaceInfo;
refine(vector<FaceInfo> &bboxs, int height, int width, bool flag)
{
    if (bboxs.empty())
        return;
    for (auto it = bboxs.begin(); it != bboxs.end(); it++)
    {
        float bw = it->x[1] - it->x[0] + 1;
        float bh = it->y[1] - it->y[0] + 1;//得到候选框的长宽
        float x0 = it->x[0] + it->regreCoord[0] * bw;
        float y0 = it->y[0] + it->regreCoord[1] * bh;
        float x1 = it->x[1] + it->regreCoord[2] * bw;
        float y1 = it->y[1] + it->regreCoord[3] * bh;//修正为候选框的比例

        if (flag)
        {
            float w = x1 - x0 + 1;
            float h = y1 - y0 + 1;//防止宽高为0
            float m = (h > w) ? h : w;
            x0 = x0 + w * 0.5 - m * 0.5;
            y0 = y0 + h * 0.5 - m * 0.5;//让x0或y0更小
            x1 = x0 + m - 1;
            y1 = y0 + m - 1;//让x1或y1更大
            //效果相当于将候选框以两个点向外拉大了
        }//这里的目的是让框尽可能的大一些,为了更好的将目标置于框中
        it->x[0] = round(x0);
        it->y[0] = round(y0);
        it->x[1] = round(x1);
        it->y[1] = round(y1);//取整赋值

        if (it->x[0] < 0) it->x[0] = 0;
        if (it->y[0] < 0) it->y[0] = 0;
        if (it->x[1] > width) it->x[1] = width - 1;
        if (it->y[1] > height) it->y[1] = height - 1;//限制坐标在图片里面
        
        it->area = (it->x[1] - it->x[0]) * (it->y[1] - it->y[0]);
    }
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值