C++实现旋转矩形的NMS

首先构造一个结构体,存旋转矩形的参数

typedef struct {
	cv::RotatedRect box;
	float score;
	int index;
}BBOX;
在这里插入代码片

准备一个排序函数,该函数可以对vector(vector里存有所有的旋转矩形的参数)里的旋转矩形按得分进行排序,得分高的排在前面/

bool sort_score(BBOX box1,BBOX box2)
{
    return (box1.score > box2.score);
}

准备一个旋转矩形iou统计函数

float calcIOU(cv::RotatedRect rect1, cv::RotatedRect rect2)
{
    float areaRect1 = rect1.size.width * rect1.size.height;
    float areaRect2 = rect2.size.width * rect2.size.height;
    vector<cv::Point2f> vertices;
    int intersectionType = cv::rotatedRectangleIntersection(rect1, rect2, vertices);
    if (vertices.size()==0)
        return 0.0;
    else{
        vector<cv::Point2f> order_pts;
        cv::convexHull(cv::Mat(vertices), order_pts, true);
        double area = cv::contourArea(order_pts);
        float inner = (float) (area / (areaRect1 + areaRect2 - area + 0.0001));
        return inner;
    }
}

最后开始我们的NMS调用

//申明BBOX类型的bbox 存单个旋转矩形的参数
BBOX bbox;
//申明vector存所有可能的旋转矩形参数的集合
vector<BBOX> bboxes;

//使用方法
bboxes.push_back(bbox);
//vector results 存nms后的结果
 vector<BBOX>results;
  sort(bboxes.begin(), bboxes.end(), sort_score);
//  cout<<bboxes.size()<<endl;

  while(bboxes.size() > 0)
  {
  int count_num=bboxes.size();
    results.push_back(bboxes[0]);

    for(int i =0;i <count_num-1;i++)// error for(int i =0;i <bboxes.size()-1;i++)
    {
       float iou_value   = calcIOU(bboxes[0].box,bboxes[i+1].box);
       if (iou_value >0.1)//nms的阈值
       {
          bboxes.erase(bboxes.begin()+i+1);
       }

    }
           bboxes.erase(bboxes.begin()+0);
  }
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值