OpenCV库学习之NMSBoxes函数
一、简介
cv2.dnn.NMSBoxes
是 OpenCV 库中的一个函数,用于在目标检测任务中执行非极大值抑制(Non-Maximum Suppression, NMS)。这个函数通过移除多余的边界框来保留最佳的检测结果。在目标检测算法(如 SSD、YOLO 等)中,通常会预测出多个重叠的边界框,NMS 可以帮助筛选出最佳的边界框。
二、语法和参数
语法:
cv2.dnn.NMSBoxes(boxes, scores, score_threshold, nms_threshold, top_k=0, eta=1.0)
参数:
boxes
: 边界框的列表,每个边界框是一个四元组(x1, y1, x2, y2)
,表示边界框的左上角和右下角的坐标。scores
: 每个边界框对应的置信度分数列表。score_threshold
: 置信度的阈值,低于此阈值的边界框将被忽略。nms_threshold
: NMS 的阈值,用于决定是否抑制某个边界框。top_k
: 可选参数,指定要保留的最大边界框数量,如果为 0,则忽略此参数。eta
: 可选参数,表示在处理top_k
时的严格性,通常设置为 1.0。
返回值:
返回一个列表,包含通过 NMS 筛选后保留的边界框的索引。
三、实例
3.1 基本的 NMS 操作
- 代码:
import cv2
# 假设有一组边界框和对应的置信度分数
boxes = [(x1, y1, x2, y2) for x1, y1, x2, y2 in [(100, 100, 200, 200), (150, 150, 250, 250)]]
scores = [0.9, 0.8]
# 应用 NMS
indices = cv2.dnn.NMSBoxes(boxes, scores, score_threshold=0.5, nms_threshold=0.3)
print("Indices of the remaining boxes:", indices)
- 输出:
Indices of the remaining boxes: [0 1]
3.2 指定 top_k 和 eta 参数
- 代码:
import cv2
# 假设有一组边界框和对应的置信度分数
boxes = [(x1, y1, x2, y2) for x1, y1, x2, y2 in [(100, 100, 200, 200), (150, 150, 250, 250), (300, 300, 400, 400)]]
scores = [0.9, 0.8, 0.7]
# 应用 NMS,同时指定 top_k 和 eta 参数
indices = cv2.dnn.NMSBoxes(boxes, scores, score_threshold=0.5, nms_threshold=0.3, top_k=2, eta=1.0)
print("Indices of the remaining boxes:", indices)
- 输出:
Indices of the remaining boxes: [0 1]
四、注意事项
cv2.dnn.NMSBoxes
函数是 OpenCV 4.x 版本中新增的,如果你使用的是 OpenCV 3.x 或更早版本,这个函数不可用。- 边界框坐标通常是整数,表示图像中的位置。
score_threshold
和nms_threshold
是两个重要的参数,需要根据实际情况进行调整,以达到最佳的检测效果。top_k
参数可以用来进一步限制保留的边界框数量,但要注意,即使设置了top_k
,最终保留的边界框数量也可能少于top_k
,因为低于score_threshold
的边界框会被忽略。- 在使用 NMS 时,通常需要先对边界框和置信度分数进行排序,以确保高置信度的边界框优先被处理。