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

在这里插入图片描述

GitHub 加速计划 / opencv31 / opencv
77.39 K
55.71 K
下载
OpenCV: 开源计算机视觉库
最近提交(Master分支:2 个月前 )
48668119 dnn: use dispatching for Winograd optimizations 6 天前
3dace76c flann: remove unused hdf5 header 6 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐