OpenCV(cv::dnn::NMSBoxes())



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
);

参数详解:

  1. bboxes:存储待处理的边界框(bounding boxes),每个 cv::Rect 元素表示一个矩形框。格式为 (x, y, width, height),代表框的左上角坐标和宽高。

  2. scores:与每个边界框对应的置信得分(confidence scores)。一般是模型对每个候选框检测出某一目标的置信度。

  3. score_threshold:得分阈值。低于该值的框将被直接过滤掉,不会参与 NMS 处理。

  4. nms_threshold:NMS 的 IoU(Intersection over Union)阈值。用于确定哪些框是“相互重叠的”,即两个框的重叠率超过该阈值时会保留得分较高的框,抑制得分较低的框。

  5. indices:输出参数,用于存储最终保留的边界框的索引。处理后,仅保留 indices 中索引对应的框作为结果。

  6. eta (可选参数):一种调节 NMS 阈值的衰减因子,默认值为 1.0。在 eta < 1 时会在每次抑制操作中逐步降低 nms_threshold。通常该参数不常用。

  7. top_k (可选参数):限制参与 NMS 处理的最高得分框数量。top_k > 0 时,仅对得分前 top_k 的框应用 NMS。



2. 函数工作流程

  1. 过滤低分框:首先过滤掉置信得分低于 score_threshold 的框,减少参与 NMS 计算的候选框数量。
  2. 排序:对剩下的边界框按得分降序排序。
  3. 迭代抑制:
    • 从最高分的框开始,计算它与其他框的 IoU 值。
    • 如果 IoU 超过 nms_threshold,则将该框从候选框中删除(认为该框可能表示同一目标)。
  4. 输出结果:将剩余框的索引存储在 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() 仅支持矩形框。如果是非矩形框或多种类型的检测任务,需在调用前转换为矩形框。


posted @   做梦当财神  阅读(362)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示