opencv3.3+python3.6学习笔记十--颜色跟踪
思路 用HSV颜色空间对输入的图片进行处理,用某一种或者几种指定的颜色进行蒙版mask处理进而得到二值化的黑白图像,膨胀和腐蚀后去除噪点,对轮廓区域进行计算,画出圆心和质心位置,并实现动态的跟踪。 HSV的基本概念和取值可以自行百度。 具体的取值参考
步骤 1. 设定需要的各个颜色的阈值 2. 读入图像,本例程采用手机作为IPWebCam,可以根据需要设定用本机摄像头还是外置摄像头 3. 转化为HSV图像 4. 采用各个颜色的蒙版 5. 将各个蒙版后的图像叠加 6. 轮廓处理 7. 绘出圆心和质心 8. 输出照片和视频 9. 清零
import cv2
import numpy as np
import time
#设定红色阈值,HSV空间
lower_red = np.array([170, 150, 50])
upper_red = np.array([179, 255, 255])
#设定黄色阈值,HSV空间
lower_yellow = np.array([26, 50, 50])
upper_yellow = np.array([34, 255, 255])
#设定蓝色的阈值
lower_blue = np.array([110,100,100])
upper_blue = np.array([130,255,255])
#设定绿色阈值
lower_green = np.array([35,150,100])
upper_green = np.array([75,255,255])
#指定写视频的格式, I420-avi, MJPG-mp4
fps=25
size=640,480
out_frame = cv2.VideoWriter(c://color_track.avi, cv2.VideoWriter_fourcc(*DIVX), fps, size)
out_hsv = cv2.VideoWriter(c://color_detect_hsv.avi, cv2.VideoWriter_fourcc(*MP42), fps, size)
out_mask = cv2.VideoWriter(c://color_detect_mask.avi, cv2.VideoWriter_fourcc(*MP42), fps, size)
#打开摄像头
video="http://aikes:701115@192.168.31.28:8080/video"
cap = cv2.VideoCapture(video)
#等待两秒
time.sleep(2)
while (1):
(ret, frame) = cap.read()
if not ret:
print (No Camera
)
break
#转到绿色的HSV空间
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
#根据阈值构建蒙版掩膜
#mask = cv2.inRange(hsv, lower_red, upper_red)
#mask = cv2.inRange(hsv, lower_blue, upper_blue)
mask_green = cv2.inRange(hsv, lower_green, upper_green)
#腐蚀操作,去除噪点
mask_green = cv2.erode(mask_green, None, iterations=2)
#膨胀操作,去除噪点
mask_green = cv2.dilate(mask_green, None, iterations=2)
#用红色的蒙版
mask_red = cv2.inRange(hsv, lower_red, upper_red)
mask_red = cv2.erode(mask_red, None, iterations=2)
mask_red = cv2.dilate(mask_red, None, iterations=2)
# 用黄色的蒙版
mask_yellow = cv2.inRange(hsv, lower_red, upper_red)
mask_yellow = cv2.erode(mask_yellow, None, iterations=2)
mask_yellow = cv2.dilate(mask_yellow, None, iterations=2)
# 轮廓检测
mask = mask_green + mask_red+mask_yellow
cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
#初始化轮廓质心
center = None
#如果存在轮廓
if len(cnts) > 0:
#找到面积最大的轮廓
c = max(cnts, key = cv2.contourArea)
#确定面积最大的轮廓的外接圆
((x, y), radius) = cv2.minEnclosingCircle(c)
#计算轮廓的矩
M = cv2.moments(c)
#计算质心
center = (int(M["m10"]/M["m00"]), int(M["m01"]/M["m00"]))
#画出圆心和质心
cv2.circle(frame, (int(x), int(y)), int(radius), (0, 255, 255), 2)
cv2.circle(frame, center, 5, (0, 0, 255), -1)
print (center)#输出圆心坐标
cv2.imshow(Frame, frame)
cv2.imshow(Frame_hsv, hsv)
cv2.imshow(Frame_mask, mask)
#out_frame.write(frame)
#out_hsv.write(hsv)
#out_mask.write(mask)
#esc键退出
if cv2.waitKey(5) == 27 or cv2.waitKey(5) == ord(q):
print(exit!
)
break
#摄像头释放
out_frame.release()
out_hsv.release()
out_mask.release()
cap.release()
cv2.destroyAllWindows()
