本文通过原理和示例对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