如何用Python OpenCV检测图像中的黄色物体?排查mask全黑异常
问题分析与修复方案
先梳理你代码里的核心问题,以及对应的解决办法:
1. 未定义boundaries变量
你定义了yellow颜色范围,但循环时直接使用了未声明的boundaries,这会直接抛出NameError。需要把yellow放进boundaries列表:
boundaries = [yellow]
2. BGR颜色范围设置错误,导致mask全黑
你当前设置的黄色BGR范围([0, 200, 200], [60, 255, 255])不符合大多数场景下的黄色取值。BGR空间对颜色的区分度较低,容易受亮度干扰,更可靠的方式是改用HSV颜色空间检测黄色:
修复后的完整代码
import cv2 import numpy as np img = cv2.imread('screenshot.png') # 先检查图片是否成功读取 if img is None: print("无法读取图片,请检查路径或文件完整性") exit() # 转换为HSV颜色空间(对颜色检测更友好) hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # HSV黄色范围(可根据你的截图实际颜色微调) lower_yellow = np.array([20, 100, 100], dtype="uint8") upper_yellow = np.array([30, 255, 255], dtype="uint8") # 创建黄色区域的mask mask = cv2.inRange(hsv_img, lower_yellow, upper_yellow) result = cv2.bitwise_and(img, img, mask=mask) # 查找轮廓 ret, thresh = cv2.threshold(mask, 40, 255, 0) contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) if len(contours) != 0: # 示例:在原图上绘制黄色物体的红色轮廓 cv2.drawContours(img, contours, -1, (0, 0, 255), 3) # 查看结果 cv2.imshow('Mask', mask) cv2.imshow('Highlighted Yellow', result) cv2.imshow('Contours', img) cv2.waitKey(0) cv2.destroyAllWindows() else: print("未检测到黄色物体")
3. 额外调试建议
- 先打印
img.shape确认图片是否正确读取,若报错则说明路径错误或图片损坏。 - 微调HSV范围:如果还是检测不到,可用OpenCV的鼠标取色工具,获取截图中黄色区域的HSV值,再调整上下限。
- 确认截图格式:确保截图是标准BGR格式(OpenCV默认读取格式),若为RGB格式需先转换。
内容的提问来源于stack exchange,提问作者Vik
相关产品推荐
相关产品推荐

