使用 Python-OpenCV 实时检测多种颜色
对于机器人可视化环境,除了物体检测,实时检测其颜色也非常重要。
为什么这很重要? : 一些实际应用
- 在自动驾驶汽车中,检测交通信号灯。
- 在一些工业机器人中使用多种颜色检测,以执行拾取和放置任务以分离不同颜色的物体。
这是一种使用Python编程语言实时检测多种颜色(这里只考虑红色、绿色和蓝色)的实现。
使用的 Python库:
- 数字货币
- OpenCV-Python
工作流程说明:
- 第 1 步:输入:通过网络摄像头捕获视频。
第 2 步:读取图像帧中的视频流。
步骤 3:将 BGR(RGB 颜色空间表示为红色、绿色和蓝色三个矩阵,整数值从 0 到 255)中的图像帧转换为 HSV(色相饱和度值)颜色空间。色调用饱和度来描述颜色,表示该颜色中灰色的数量,值描述颜色的亮度或强度。这可以表示为分别在 0-179、0-255 和 0-255 范围内的三个矩阵。
步骤 4:定义每种颜色的范围并创建相应的蒙版。
第 5 步:形态变换:膨胀,从图像中去除噪声。
步骤 6:在图像帧和掩码之间执行 bitwise_and 以专门检测特定颜色并区分其他颜色。
第 7 步:为各个颜色创建轮廓以区分显示检测到的颜色区域。
第 8 步:输出:实时检测颜色。
下面是实现。
# Python code for Multiple Color Detection
import numpy as np
import cv2
# Capturing video through webcam
webcam = cv2.VideoCapture(0)
# Start a while loop
while(1):
# Reading the video from the
# webcam in image frames
_, imageFrame = webcam.read()
# Convert the imageFrame in
# BGR(RGB color space) to
# HSV(hue-saturation-value)
# color space
hsvFrame = cv2.cvtColor(imageFrame, cv2.COLOR_BGR2HSV)
# Set range for red color and
# define mask
red_lower = np.array([136, 87, 111], np.uint8)
red_upper = np.array([180, 255, 255], np.uint8)
red_mask = cv2.inRange(hsvFrame, red_lower, red_upper)
# Set range for green color and
# define mask
green_lower = np.array([25, 52, 72], np.uint8)
green_upper = np.array([102, 255, 255], np.uint8)
green_mask = cv2.inRange(hsvFrame, green_lower, green_upper)
# Set range for blue color and
# define mask
blue_lower = np.array([94, 80, 2], np.uint8)
blue_upper = np.array([120, 255, 255], np.uint8)
blue_mask = cv2.inRange(hsvFrame, blue_lower, blue_upper)
# Morphological Transform, Dilation
# for each color and bitwise_and operator
# between imageFrame and mask determines
# to detect only that particular color
kernal = np.ones((5, 5), "uint8")
# For red color
red_mask = cv2.dilate(red_mask, kernal)
res_red = cv2.bitwise_and(imageFrame, imageFrame,
mask = red_mask)
# For green color
green_mask = cv2.dilate(green_mask, kernal)
res_green = cv2.bitwise_and(imageFrame, imageFrame,
mask = green_mask)
# For blue color
blue_mask = cv2.dilate(blue_mask, kernal)
res_blue = cv2.bitwise_and(imageFrame, imageFrame,
mask = blue_mask)
# Creating contour to track red color
contours, hierarchy = cv2.findContours(red_mask,
cv2.RETR_TREE,
cv2.CHAIN_APPROX_SIMPLE)
for pic, contour in enumerate(contours):
area = cv2.contourArea(contour)
if(area > 300):
x, y, w, h = cv2.boundingRect(contour)
imageFrame = cv2.rectangle(imageFrame, (x, y),
(x + w, y + h),
(0, 0, 255), 2)
cv2.putText(imageFrame, "Red Colour", (x, y),
cv2.FONT_HERSHEY_SIMPLEX, 1.0,
(0, 0, 255))
# Creating contour to track green color
contours, hierarchy = cv2.findContours(green_mask,
cv2.RETR_TREE,
cv2.CHAIN_APPROX_SIMPLE)
for pic, contour in enumerate(contours):
area = cv2.contourArea(contour)
if(area > 300):
x, y, w, h = cv2.boundingRect(contour)
imageFrame = cv2.rectangle(imageFrame, (x, y),
(x + w, y + h),
(0, 255, 0), 2)
cv2.putText(imageFrame, "Green Colour", (x, y),
cv2.FONT_HERSHEY_SIMPLEX,
1.0, (0, 255, 0))
# Creating contour to track blue color
contours, hierarchy = cv2.findContours(blue_mask,
cv2.RETR_TREE,
cv2.CHAIN_APPROX_SIMPLE)
for pic, contour in enumerate(contours):
area = cv2.contourArea(contour)
if(area > 300):
x, y, w, h = cv2.boundingRect(contour)
imageFrame = cv2.rectangle(imageFrame, (x, y),
(x + w, y + h),
(255, 0, 0), 2)
cv2.putText(imageFrame, "Blue Colour", (x, y),
cv2.FONT_HERSHEY_SIMPLEX,
1.0, (255, 0, 0))
# Program Termination
cv2.imshow("Multiple Color Detection in Real-TIme", imageFrame)
if cv2.waitKey(10) & 0xFF == ord('q'):
cap.release()
cv2.destroyAllWindows()
break
输出: