会色彩追踪的视觉技术
功能描述
依据用户选择的特定颜色,进行物体时时追踪,并进行矩形框标准,获取相角度、长宽等信息。
模块功能
import cv2 # 视觉处理模块
import numpy as np # 数据处理模块
设计思路
将图像有原始的RGB色彩模式转换为HSV色彩模式,通过设置色调(H),饱和度(S),明度(V)参数得到相应的物体颜色蒙版(MASK),再通过阈值调节、形态学操作等获取较为精确的轮廓(CONTOURS),依据opencv中关于轮廓的应用,获取相关轮廓信息,并进行图像标注(MARK)。
代码实现
import cv2
import numpy as np
def nothing(e):
pass
def color_finder(frame, flag_write=True):
# 获取初始化参数
size = (cv2.getTrackbarPos('size', 'parameters') + 1) / 10
H_U = cv2.getTrackbarPos('H_U', 'parameters')
S_U = cv2.getTrackbarPos('S_U', 'parameters')
V_U = cv2.getTrackbarPos('V_U', 'parameters')
H_L = cv2.getTrackbarPos('H_L', 'parameters')
S_L = cv2.getTrackbarPos('S_L', 'parameters')
V_L = cv2.getTrackbarPos('V_L', 'parameters')
THR = cv2.getTrackbarPos('threshold', 'parameters')
C_k_size = cv2.getTrackbarPos('C_kernal', 'parameters')
O_k_size = cv2.getTrackbarPos('O_kernal', 'parameters')
O_Iter = cv2.getTrackbarPos('O_Iter', 'parameters')
C_Iter = cv2.getTrackbarPos('C_Iter', 'parameters')
# 图像翻转
# frame = cv2.flip(frame, 1)
frame = cv2.resize(frame, (0, 0), fx=size, fy=size)
# 色彩空间转换
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 灰度图
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)# HSV空间
# 色彩追踪阈值
lower_blue = np.array([H_L, S_L, V_L])
upper_blue = np.array([H_U, S_U, V_U])
# 定义卷积核大小,数据类型
C_kernel = np.ones((C_k_size, C_k_size), np.uint8)
O_kernel = np.ones((O_k_size, O_k_size), np.uint8)
# C_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (C_k_size, C_k_size))
# O_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (O_k_size, O_k_size))
# 色彩阈值过滤
mask = cv2.inRange(hsv, lower_blue, upper_blue)
# 高斯模糊
mask = cv2.GaussianBlur(mask, (15, 15), 0)
# 高斯边缘阈值
_, mask = cv2.threshold(mask, THR, 255, cv2.THRESH_TOZERO)
# 形态学操作(开,闭)操作
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, O_kernel, iterations=O_Iter)
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, C_kernel, iterations=C_Iter)
# mask = cv2.bitwise_not(mask)
# 逻辑运算(或运算)
res = cv2.bitwise_or(frame, frame, mask=mask)
# 轮廓查找
contours, her = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# cv2.drawContours(res, contours, -1, (0, 0, 255), 1)
if contours != []:
for i in range(len(contours)):
# 轮廓最小矩形框
rect = cv2.minAreaRect(contours[i])
# 最小矩形框点集合
box = cv2.boxPoints(rect)
box = np.int0(box)
if flag_write == True:
# 绘制轮廓
cv2.drawContours(res, [box], 0, (0, 0, 255), 2)
# 标志矩形框角度,长宽等信息
cv2.putText(res, text=f'ID:{i} A:{rect[2]:.2f} ,W:{rect[1][0]:.2f},h:{rect[1][1]:.2f} ',
org=tuple(np.int0(rect[0])),
fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=0.5, color=(255, 255, 0), thickness=2)
else:
cv2.drawContours(frame, [box], 0, (0, 0, 255), 2)
cv2.putText(frame, text=f'ID:{i} A:{rect[2]:.2f} ,W:{rect[1][0]:.2f},h:{rect[1][1]:.2f} ',
org=tuple(np.int0(rect[0])),
fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=0.5, color=(255, 255, 0), thickness=2)
if flag_write == True:
# cv2.imshow('gray', gray)
# cv2.imshow('hsv', hsv)
cv2.imshow('mask', mask)
cv2.imshow('res', res)
# cv2.imshow('frame', frame)
if __name__ == '__main__':
# 定义参数选项
cv2.namedWindow('parameters', cv2.WINDOW_NORMAL)
cv2.resizeWindow('parameters', 1000, 500)
cv2.createTrackbar('size', 'parameters', 0, 10, nothing)#图像尺寸
cv2.createTrackbar('H_L', 'parameters', 0, 180, nothing)#色调低值
cv2.createTrackbar('H_U', 'parameters', 0, 180, nothing)#色调高值
cv2.createTrackbar('S_L', 'parameters', 0, 255, nothing)#饱和度低值
cv2.createTrackbar('S_U', 'parameters', 0, 255, nothing)#饱和度高值
cv2.createTrackbar('V_L', 'parameters', 0, 255, nothing)#明度低值
cv2.createTrackbar('V_U', 'parameters', 0, 255, nothing)#明度高值
cv2.createTrackbar('threshold', 'parameters', 0, 255, nothing)#边缘阈值
cv2.createTrackbar('C_kernal', 'parameters', 0, 200, nothing)#形态学闭操作,卷积核大小
cv2.createTrackbar('C_Iter', 'parameters', 1, 10, nothing)#形态学闭操作,卷积次数
cv2.createTrackbar('O_kernal', 'parameters', 0, 200, nothing)##形态学开操作,卷积核大小
cv2.createTrackbar('O_Iter', 'parameters', 1, 10, nothing)#形态学开操作,卷积次数
cv2.setTrackbarPos('H_U', 'parameters', 255)#设置默认参数
cv2.setTrackbarPos('S_U', 'parameters', 255)#设置默认参数
cv2.setTrackbarPos('V_U', 'parameters', 255)#设置默认参数
cv2.setTrackbarPos('C_kernal', 'parameters', 1)#设置默认参数
cv2.setTrackbarPos('O_kernal', 'parameters', 1)#设置默认参数
cap = cv2.VideoCapture(0)
while cap.isOpened():
_, frame = cap.read()
color_finder(frame)
if cv2.waitKey(5) == 27:
break
cap.release()
cv2.destroyAllWindows()