使用 OpenCV 和 Python 从 HSV 图像检测颜色时遇到问题
Trouble with detecting color from HSV image using OpenCV and Python
我正在尝试使用 OpenCV 和 Python 执行简单的彩色对象检测。
我已经阅读了几个教程,但遇到了一个令人困惑的问题,阻碍了我的进步。虽然我提供了正确的 HSV 数据,但我的程序似乎没有检测到那种颜色的对象。
我使用这张图片(抱歉我的网络摄像头质量不佳):
为了检测红色物体,我恢复了HSV颜色数据:
这是我的代码:
YELLOW = 30
BLUE = 210
GREEN = 145
RED = 320
color = RED
img = cv2.imread("sample.png")
hue = color // 2
lower_range = np.array([max(0, hue - 10), 0, 0], dtype=np.uint8)
upper_range = np.array([min(180, hue + 10), 255, 255], dtype=np.uint8)
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(img, lower_range, upper_range)
binary_img = cv2.bitwise_and(img_hsv, img_hsv, mask=mask)
binary_img = cv2.cvtColor(binary_img, cv2.COLOR_BGR2GRAY)
_, binary_img = cv2.threshold(binary_img, 127, 255, cv2.THRESH_BINARY)
cv2.imshow('sample', binary_img)
cv2.waitKey(0)
结果:
其他颜色的结果是正确的(不完美,因为我猜质量很差),但我无法得到红色的东西。然而,HSV 转换后的图像非常明显:
请问你明白我哪里做错了吗?
您做的一切都正确,唯一的问题是您将阈值应用于 BGR 图像而不是 HSV。
变化:
mask = cv2.inRange(img, lower_range, upper_range)
到
mask = cv2.inRange(img_hsv, lower_range, upper_range)
我测试了一下,看起来还不错。我想您需要一些形态学操作才能得到最终结果。
我正在尝试使用 OpenCV 和 Python 执行简单的彩色对象检测。
我已经阅读了几个教程,但遇到了一个令人困惑的问题,阻碍了我的进步。虽然我提供了正确的 HSV 数据,但我的程序似乎没有检测到那种颜色的对象。
我使用这张图片(抱歉我的网络摄像头质量不佳):
为了检测红色物体,我恢复了HSV颜色数据:
这是我的代码:
YELLOW = 30
BLUE = 210
GREEN = 145
RED = 320
color = RED
img = cv2.imread("sample.png")
hue = color // 2
lower_range = np.array([max(0, hue - 10), 0, 0], dtype=np.uint8)
upper_range = np.array([min(180, hue + 10), 255, 255], dtype=np.uint8)
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(img, lower_range, upper_range)
binary_img = cv2.bitwise_and(img_hsv, img_hsv, mask=mask)
binary_img = cv2.cvtColor(binary_img, cv2.COLOR_BGR2GRAY)
_, binary_img = cv2.threshold(binary_img, 127, 255, cv2.THRESH_BINARY)
cv2.imshow('sample', binary_img)
cv2.waitKey(0)
结果:
其他颜色的结果是正确的(不完美,因为我猜质量很差),但我无法得到红色的东西。然而,HSV 转换后的图像非常明显:
请问你明白我哪里做错了吗?
您做的一切都正确,唯一的问题是您将阈值应用于 BGR 图像而不是 HSV。
变化:
mask = cv2.inRange(img, lower_range, upper_range)
到
mask = cv2.inRange(img_hsv, lower_range, upper_range)
我测试了一下,看起来还不错。我想您需要一些形态学操作才能得到最终结果。