opencv识别颜色块并进行跟踪
1.导入库
import cv2
import numpy as np
2.读取目标颜色块的图像,并读取颜色BGR通道的值
img[1900,1400] 确定颜色区域某个位置点即可,可使用画图工具打开图像获取
img = cv2.imread('2.jpg')
blue,green,red = img[1900,1400]
print(blue,green,red)
color = np.uint8([[[blue, green, red]]])
3.修改颜色通道
原因:在 HSV 颜色空间中要比在 BGR 空间中更容易表示一个特定颜色。通过计算可得到该颜色的上、下hsv范围
#颜色通道BGR 改为 HSV
hsv_color = cv2.cvtColor(color, cv2.COLOR_BGR2HSV)
#将值赋给hue
hue = hsv_color[0][0][0]
#算出lower and upper bounds
lower_bound = [hue - 10, 100, 100]
upper_bound = [hue + 10, 255, 255]
4.开启摄像头 (以下是对摄像头读取的每一帧图像进行处理)
完成了对颜色块的hsv读取,之后我们只需要对摄像头读取的图像每一帧进行一个扫描,找到该hsv阈值内的颜色块,并将它用框框框起来
cap = cv2.VideoCapture(0)
5.对图像做高斯平滑处理
while True:
ret, frame = cap.read()
if ret!=1:
break
#高斯
imgGaussian = cv2.GaussianBlur(frame,(5,5),0)
6.创建一个掩码
掩码:目标颜色块为255(白),其他无关的全为0(黑)
# 将BGR图像转换为HSV图像
hsv = cv2.cvtColor(imgGaussian, cv2.COLOR_BGR2HSV)
# 使用NumPy创建数组以保存下限和上限范围
lower_range = np.array(lower_bound, dtype=np.uint8)
upper_range = np.array(upper_bound, dtype=np.uint8)
# 创建一个掩码
#掩码中255白色表示目标,
mask = cv2.inRange(hsv, lower_range, upper_range)
7.对掩码进行形态学操作
将错误识别的小点点滤除,减小干扰
imgErode = cv2.erode(mask,(5,5),iterations = 5)
opening = cv2.morphologyEx(imgErode, cv2.MORPH_OPEN, (5, 5))
opening = cv2.morphologyEx(opening, cv2.MORPH_OPEN, (5, 5))
opening = cv2.morphologyEx(opening, cv2.MORPH_OPEN, (5, 5)
8.寻找轮廓
并设置一个范围,对可能出现的错误颜色区域不进行识别,因为背景环境有可能跟目标颜色块颜色相同,导致错误识别
cnt,hierarchy = cv2.findContours(opening,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
for i, c in enumerate(cnt):
(x, y, w, h) = cv2.boundingRect(c)
#轮廓中心点
if w*h < 50:
continue
#cx = x+w/2
#cy = y+h/2
cv2.rectangle(frame,(x-20,y-20),(x+w+20,y+h+20),(0,0,255),3)
9.显示图像
# 显示原始图像和掩码图像
cv2.imshow('Canny',opening)
cv2.imshow('img', frame)
# 等待用户按下 ESC 键
k = cv2.waitKey(10)
if k == 27: # ESC键的ASCII码为27
break
# 关闭所有窗口
cv2.destroyAllWindows()
到这就完成了,如果觉得对你有帮助,麻烦点个赞!