opencv-python识别粉色木条时检测到多个错误边界框的原因是什么
错误原因
- 二值化后目标区域不连通:你要检测的粉色木条上印有数字,数字颜色不属于你设置的粉色HSV阈值范围,会被
inRange函数判定为非目标区域,相当于完整的粉色条被数字切割成了多个零散的不连通粉色区域;再加上滤波后残留的极小背景噪声点,也会形成独立的二值化白色区域。 - 没有做轮廓过滤逻辑:代码直接遍历
findContours返回的所有轮廓,没有根据面积、宽高等特征筛掉不符合目标尺寸的小轮廓,那些只有几像素的噪声区域、被数字切割出的小粉色块都会被单独生成边界框。 - 没有做同目标轮廓合并:即使多个零散轮廓都属于同一个粉色木条,代码也会将其判定为独立目标,分别输出坐标。
修复方案
你可以通过以下步骤修改代码解决问题:
- 对二值图做闭运算,填补数字造成的孔洞,让粉色区域恢复为连通整体
- 增加轮廓面积/尺寸过滤,直接筛除尺寸明显不符合目标的小轮廓
- 可选:如果仍有多个同目标轮廓,合并所有符合要求的轮廓生成统一边界框
修改后的参考代码
import numpy as np import cv2 imagePath = "core4.jpg" im = cv2.imread(imagePath) # 原有预处理逻辑 im = cv2.bilateralFilter(im,9,75,75) im = cv2.fastNlMeansDenoisingColored(im,None,10,10,7,21) hsv_img = cv2.cvtColor(im, cv2.COLOR_BGR2HSV) COLOR_MIN = np.array([130,0,220],np.uint8) COLOR_MAX = np.array([170,255,255],np.uint8) frame_threshed = cv2.inRange(hsv_img, COLOR_MIN, COLOR_MAX) # 新增:闭运算填补孔洞 kernel = np.ones((5,5), np.uint8) frame_threshed = cv2.morphologyEx(frame_threshed, cv2.MORPH_CLOSE, kernel, iterations=2) ret,thresh = cv2.threshold(frame_threshed,127,255,0) contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) # 新增:轮廓过滤,可根据你的目标实际尺寸调整阈值,示例过滤掉宽或高小于20的轮廓 valid_contours = [] for cnt in contours: x,y,w,h = cv2.boundingRect(cnt) if w >= 20 and h >=20: valid_contours.append(cnt) # 合并有效轮廓生成唯一边界框 if valid_contours: # 计算所有有效轮廓的最小外接矩形 all_x = [] all_y = [] all_xw = [] all_yh = [] for cnt in valid_contours: x,y,w,h = cv2.boundingRect(cnt) all_x.append(x) all_y.append(y) all_xw.append(x+w) all_yh.append(y+h) x_min = min(all_x) y_min = min(all_y) w_final = max(all_xw) - x_min h_final = max(all_yh) - y_min print(x_min, y_min, w_final, h_final) cv2.rectangle(im,(x_min,y_min),(x_min+w_final,y_min+h_final),(0,255,0),2) cv2.imwrite("core4_cropped.jpg", im)
内容的提问来源于stack exchange,提问作者Miladfa7
相关产品推荐
相关产品推荐

