1. cv2.dnn.NMSBoxes

cv2.dnn.NMSBoxes 函数是 OpenCV 库中用于非极大值抑制(Non-Maximum Suppression,NMS)的函数,用于在对象检测任务中筛选出重叠的边界框,仅保留最佳的一个。在使用这个函数时,传入的 boxes 参数通常是一组预测的边界框坐标。

函数原型

cv2.dnn.NMSBoxes(boxes, scores, score_threshold, nms_threshold, eta=1.0, top_k=0)

参数说明

  • boxes: float 类型的数组,形状为 [num_boxes, 4],表示边界框的坐标。每个边界框由其左上角和右下角的坐标 [x, y, w, h] 表示。(x,y)为左上角坐标
  • scores: float 类型的数组,形状为 [num_boxes],表示每个边界框的置信度分数。
  • score_threshold: float 类型,用于过滤低于这个分数阈值的边界框。
  • nms_threshold: float 类型,用于确定哪些重叠的边界框应该被保留。如果两个边界框的重叠面积大于 nms_threshold,则其中一个边界框将被丢弃。
  • eta: float 类型,默认值为 1,用于自适应调整 NMS 阈值。如果设置为小于 1 的值,则 NMS 阈值会随着迭代的进行而减小,这有助于在迭代过程中保留更多的边界框。
  • top_k: int 类型,表示保留的最大边界框数量。默认值为 0,表示保留所有边界框。

返回值

返回值是一个整数数组,包含了保留下来边界框的索引。

用法示例

import cv2
# 假设我们有一组边界框和置信度分数
boxes = [[10, 20, 40, 60], [20, 30, 50, 70], [30, 40, 60, 80]]
scores = [0.9, 0.8, 0.7]
# 设置分数阈值和 NMS 阈值
score_threshold = 0.8
nms_threshold = 0.5
# 执行 NMS
indices = cv2.dnn.NMSBoxes(boxes, scores, score_threshold, nms_threshold)
# 输出保留的边界框索引
print(indices)

在这个例子中,boxes 是边界框的坐标列表,scores 是与每个边界框对应的置信度分数列表。函数会根据置信度分数和非极大值抑制的阈值来过滤掉重叠的边界框,只保留最有可能包含目标的边界框。返回的 indices 包含了保留下来边界框的索引。

2. cv2.dnn.NMSBoxesRotated

cv2.dnn.NMSBoxesRotated 函数是 OpenCV 库中用于对旋转的边界框执行非极大值抑制(Non-Maximum Suppression,NMS)的函数。它用于在对象检测任务中筛选出重叠的旋转边界框,仅保留最佳的一个。

函数原型

cv2.dnn.NMSBoxesRotated(boxes, scores, score_threshold, nms_threshold, eta=1.0, top_k=0)

参数说明

  • boxes: float 类型的数组,形状为 [num_boxes, 5],表示旋转边界框的坐标。每个旋转边界框由一个元组表示,格式为 ((center_x, center_y),(width, height), angle)
  • scores: float 类型的数组,形状为 [num_boxes],表示每个旋转边界框的置信度分数。
  • score_threshold: float 类型,用于过滤低于这个分数阈值的旋转边界框。
  • nms_threshold: float 类型,用于确定哪些重叠的旋转边界框应该被保留。如果两个旋转边界框的重叠面积大于 nms_threshold,则其中一个旋转边界框将被丢弃。
  • eta: float 类型,默认值为 1,用于自适应调整 NMS 阈值。如果设置为小于 1 的值,则 NMS 阈值会随着迭代的进行而减小,这有助于在迭代过程中保留更多的旋转边界框。
  • top_k: int 类型,表示保留的最大旋转边界框数量。默认值为 0,表示保留所有旋转边界框。

返回值

返回值是一个整数数组,包含了保留下来旋转边界框的索引。

用法示例

import cv2
# 假设我们有一组旋转边界框和置信度分数
boxes = [((100, 100), (50, 50), -30), ((150, 150), (60, 60), 45), ((200, 200), (70, 70), 0)]
scores = [0.9, 0.8, 0.7]
# 设置分数阈值和 NMS 阈值
score_threshold = 0.8
nms_threshold = 0.5
# 执行 NMS
indices = cv2.dnn.NMSBoxesRotated(boxes, scores, score_threshold, nms_threshold)
# 输出保留的旋转边界框索引
print(indices)

在这个例子中,boxes 是旋转边界框的坐标列表,scores 是与每个旋转边界框对应的置信度分数列表。函数会根据置信度分数和非极大值抑制的阈值来过滤掉重叠的旋转边界框,只保留最有可能包含目标的旋转边界框。返回的 indices 包含了保留下来旋转边界框的索引。

注意

①yolov8的旋转目标检测的输出是:(1,25,8400)

  • 1是batch_size
  • 25是4个坐标(x_conter,y_conter,w,h),20个类别的概率,1个旋转角度(弧度)
  • 8400是8400个预选框

②yolov10水平目标检测输出:(1,300,6)

  • 1是batch_size
  • 6是4个坐标(x1,y1r,w,h),1个置信度,1个类别
  • 300是300个预选框
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

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

更多推荐