cv2.dnn.NMSBoxes()用法
时间: 2023-05-13 13:07:13 浏览: 582
cv2.dnn.NMSBoxes()是OpenCV中的一个函数,用于执行非最大值抑制(NMS)操作,用于过滤掉重叠的边界框。该函数的用法如下:
cv2.dnn.NMSBoxes(bboxes, scores, score_threshold, nms_threshold)
其中,bboxes是一个包含边界框坐标的数组,scores是一个包含每个边界框得分的数组,score_threshold是一个得分阈值,nms_threshold是一个NMS阈值。该函数返回一个保留的边界框的索引列表。
相关问题
def post_process_opencv(outputs,model_h,model_w,img_h,img_w,thred_nms,thred_cond): # 获取置信度、中心点坐标、宽和高 conf = outputs[:,4].tolist() c_x = outputs[:,0]/model_w*img_w c_y = outputs[:,1]/model_h*img_h w = outputs[:,2]/model_w*img_w h = outputs[:,3]/model_h*img_h p_cls = outputs[:,5:] # 如果是一维向量,则扩展为二维 if len(p_cls.shape)==1: p_cls = np.expand_dims(p_cls,1) # 获取类别ID cls_id = np.argmax(p_cls,axis=1) # 计算四个边缘坐标 p_x1 = np.expand_dims(c_x-w/2,-1) p_y1 = np.expand_dims(c_y-h/2,-1) p_x2 = np.expand_dims(c_x+w/2,-1) p_y2 = np.expand_dims(c_y+h/2,-1) areas = np.concatenate((p_x1,p_y1,p_x2,p_y2),axis=-1) # 转换为列表格式 areas = areas.tolist() # 应用非极大值抑制算法获取IDs ids = cv2.dnn.NMSBoxes(areas,conf,thred_cond,thred_nms) # 返回包含筛选后的区域、置信度和类别ID的数据列表 return [np.array(areas)[ids],np.array(conf)[ids],cls_id[ids]]以上代码报错Traceback (most recent call last): File "detect_onnx.py", line 112, in <module> outs=post_process_opencv(outs,320,320,480,640,0.4,0.5) File "detect_onnx.py", line 60, in post_process_opencv ids = cv2.dnn.NMSBoxes(areas,conf,thred_cond,thred_nms) TypeError: Can't convert vector element for 'bboxes', index=0
这个错误通常是由于 `areas` 向量中的元素不是整数或浮点数类型,导致不能被转换为 `cv::Rect` 类型。建议将 `areas` 向量中的元素转换为整数或浮点数类型,可以使用 `astype()` 方法来实现这一点。例如,可以像下面这样修改代码:
```
# 将 areas 转换为列表格式,并将元素转换为整数类型
areas = areas.astype(int).tolist()
# 应用非极大值抑制算法获取IDs
ids = cv2.dnn.NMSBoxes(areas, conf, thred_cond, thred_nms)
# 返回包含筛选后的区域、置信度和类别ID的数据列表
return [np.array(areas)[ids], np.array(conf)[ids], cls_id[ids]]
```
这样就可以避免这个错误了。如果还有问题,请检查代码中的其他部分是否存在错误。
Traceback (most recent call last): File "detect_onnx.py", line 112, in <module> outs=post_process_opencv(outs,320,320,480,640,0.4,0.5) File "detect_onnx.py", line 60, in post_process_opencv ids = cv2.dnn.NMSBoxes(areas,conf,thred_cond,thred_nms) TypeError: Can't convert vector element for 'bboxes', index=0报错 # 转换为列表格式 areas = areas.tolist() # 应用非极大值抑制算法获取IDs ids = cv2.dnn.NMSBoxes(areas,conf,thred_cond,thred_nms) # 返回包含筛选后的区域、置信度和类别ID的数据列表 return [np.array(areas)[ids],np.array(conf)[ids],cls_id[ids]]
这个错误通常是由于 `areas` 向量中的元素不是整数或浮点数类型,导致不能被转换为 `cv::Rect` 类型。建议将 `areas` 向量中的元素转换为整数或浮点数类型,可以使用 `astype()` 方法来实现这一点。例如,可以像下面这样修改代码:
```
# 将 areas 转换为列表格式,并将元素转换为整数类型
areas = areas.astype(int).tolist()
# 应用非极大值抑制算法获取IDs
ids = cv2.dnn.NMSBoxes(areas, conf, thred_cond, thred_nms)
# 返回包含筛选后的区域、置信度和类别ID的数据列表
return [np.array(areas)[ids], np.array(conf)[ids], cls_id[ids]]
```
这样就可以避免这个错误了。如果还有问题,请检查代码中的其他部分是否存在错误。
阅读全文