首先构造一个结构体,存旋转矩形的参数
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);
}