目录
cv::dnn::NMSBoxes()
是 OpenCV DNN 模块中用于非极大值抑制(Non-Maximum Suppression, NMS)的函数,常用于目标检测任务中,以去除重叠度较高的框,保留检测得分最高的框。
cv::dnn::NMSBoxes()
主要在检测过程中对多个候选框进行处理,通过限制重叠的框数量来提升结果质量。
1. 函数定义
void cv::dnn::NMSBoxes(
const std::vector<cv::Rect>& bboxes,
const std::vector<float>& scores,
float score_threshold,
float nms_threshold,
std::vector<int>& indices,
float eta = 1.0f,
int top_k = 0
);
参数详解:
-
bboxes
:存储待处理的边界框(bounding boxes),每个cv::Rect
元素表示一个矩形框。格式为(x, y, width, height)
,代表框的左上角坐标和宽高。 -
scores
:与每个边界框对应的置信得分(confidence scores)。一般是模型对每个候选框检测出某一目标的置信度。 -
score_threshold
:得分阈值。低于该值的框将被直接过滤掉,不会参与 NMS 处理。 -
nms_threshold
:NMS 的 IoU(Intersection over Union)阈值。用于确定哪些框是“相互重叠的”,即两个框的重叠率超过该阈值时会保留得分较高的框,抑制得分较低的框。 -
indices
:输出参数,用于存储最终保留的边界框的索引。处理后,仅保留indices
中索引对应的框作为结果。 -
eta
(可选参数):一种调节 NMS 阈值的衰减因子,默认值为1.0
。在eta < 1
时会在每次抑制操作中逐步降低nms_threshold
。通常该参数不常用。 -
top_k
(可选参数):限制参与 NMS 处理的最高得分框数量。top_k > 0
时,仅对得分前top_k
的框应用 NMS。
2. 函数工作流程
- 过滤低分框:首先过滤掉置信得分低于
score_threshold
的框,减少参与 NMS 计算的候选框数量。 - 排序:对剩下的边界框按得分降序排序。
- 迭代抑制:
- 从最高分的框开始,计算它与其他框的 IoU 值。
- 如果 IoU 超过
nms_threshold
,则将该框从候选框中删除(认为该框可能表示同一目标)。
- 输出结果:将剩余框的索引存储在
indices
中作为最终结果。
3. 示例代码
以下示例展示了如何在目标检测过程中使用 cv::dnn::NMSBoxes()
来过滤重叠框:
#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
int main() {
// 示例框和得分
std::vector<cv::Rect> bboxes = { {10, 10, 50, 50}, {15, 15, 50, 50}, {100, 100, 60, 60} };
std::vector<float> scores = { 0.9, 0.85, 0.7 };
// 设置阈值
float score_threshold = 0.5;
float nms_threshold = 0.3;
// 存储保留的框索引
std::vector<int> indices;
// 执行 NMS
cv::dnn::NMSBoxes(bboxes, scores, score_threshold, nms_threshold, indices);
// 输出结果
for (int idx : indices) {
std::cout << "保留框的索引:" << idx << " 位置:" << bboxes[idx] << std::endl;
}
return 0;
}
4. 应用场景
在目标检测中,通过 cv::dnn::NMSBoxes()
可以消除冗余检测框,仅保留置信度高的框。例如在 YOLO、SSD 等模型的后处理阶段,可使用该函数来抑制相互重叠的检测框,提升检测结果的质量。
5. 注意事项
nms_threshold
的选择非常关键,过低的阈值会抑制过多的框,导致漏检;过高的阈值则可能保留过多的框,增加重复检测。cv::dnn::NMSBoxes()
仅支持矩形框。如果是非矩形框或多种类型的检测任务,需在调用前转换为矩形框。
标签:得分,NMS,dnn,OpenCV,threshold,cv,NMSBoxes From: https://www.cnblogs.com/keye/p/18517430