主页 > IT业界  > 

【Opencv】cv::dnn::NMSBoxes()函数详解

【Opencv】cv::dnn::NMSBoxes()函数详解

本文通过原理和示例对cv::dnn::NMSBoxes()进行解读,帮助大家理解和使用。

原理

cv::dnn::NMSBoxes是OpenCV库中的一个函数,用于在目标检测中处理多个预测框。在目标检测中,模型可能会为同一个物体生成多个预测框,这时就需要通过非极大值抑制(Non-Maximum Suppression,NMS)来抑制冗余的预测框。 函数原型:

void cv::dnn::NMSBoxes( vector<cv::Rect> _boxes, vector<float> _scores, float _score_threshold, float _nms_threshold, vector<int> _indices)

参数详解:

_boxes: 输入边界框,一般为(x, y, w, h)格式的Rect格式的容器。 _scores: 输入边界框的预测分数,一般为每个边界框的类别概率或类别得分。 _score_threshold: 分数阈值,低于此阈值的边界框将被过滤掉。 _nms_threshold: 非极大值抑制阈值,用于决定哪些边界框之间的重叠度过高,需要抑制。 _indices: 输出参数,包含被选中的边界框的索引。

这个函数的作用是,首先根据_score_threshold过滤掉那些分数低于阈值的预测框。然后对剩余的预测框进行非极大值抑制,即对每个预测框,如果它的周围有高于它的预测框,则将该预测框抑制掉。最后,保留那些没有被抑制的预测框,这些预测框的索引保存在_indices中。

示例 #include <opencv2/opencv.hpp> #include <vector> #include <random> #include <iostream> int main() { // 随机生成一些边界框和置信度 std::vector<cv::Rect> boxes = { {100, 100, 200, 200}, // (x, y, w, h)格式的边界框坐标 {150, 150, 250, 250}, {120, 120, 220, 220}, {360, 200, 220, 220}, {400, 220, 100, 300}, {180, 120, 220, 300}, // 可以继续添加更多的边界框... }; std::vector<float> scores = { 0.9, 0.8, 0.7, 0.3, 0.5, 0.6}; // 每个边界框的置信度或类别概率 // 设置NMS的参数 static const float score_threshold = 0.5; // 分数阈值 static const float nms_threshold = 0.4; // 非极大值抑制阈值 std::vector<int> indices; // 存放被选中的边界框的索引 // 执行NMS算法 cv::dnn::NMSBoxes(boxes, scores, score_threshold, nms_threshold, indices); // 输出结果 for (int i = 0; i < indices.size(); i++) { std::cout << "Selected box index: " << indices[i] << std::endl; } return 0; }

输出结果为:

Selected box index: 0 Selected box index: 1

标签:

【Opencv】cv::dnn::NMSBoxes()函数详解由讯客互联IT业界栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【Opencv】cv::dnn::NMSBoxes()函数详解