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()
经验分享 程序员 微信小程序 职场和发展