【OpenCV中文手册学习-5】基于hsv色彩空间的目标追踪

1. hsv色彩空间

  • 色调H:用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°;
  • 饱和度S:饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和;
  • 明度V:明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。

在这里插入图片描述

在HSV中比在BGR颜色空间中更容易表示颜色。可以通过设置HSV色彩空间的高低阈值来提取出图像中的特定区域。

2. 综合程序

2.1 功能概述

该程序的输入是一个视频,视频中有一些晃动的绿色小球,本程序实现基于hsv的色彩空间对视频中的小球进行提取和追踪。
在这里插入图片描述

2.2 代码实现

import cv2 as cv
import numpy as np

# 追踪程序
def test():
    color = eval(input("请输入追踪的颜色bgr表示:"))
    target_hsv = cv.cvtColor(np.uint8(color).reshape((1,1,3)),cv.COLOR_BGR2HSV)
    print(f'target_hsv = {target_hsv}')
    target_hsv = target_hsv.flatten()
    BOUND = 20
    lower_hsv = np.array([target_hsv[0]-BOUND,10,10])
    higher_hsv = np.array([target_hsv[0]+BOUND,255,255])
    print(f'lower_hsv={lower_hsv};higher_hsv={higher_hsv}')

    cap = cv.VideoCapture("videos/green_ball.mp4")
    while True:
        # 读取帧
        ret, frame = cap.read()
        if not ret:break
        
        # 转换颜色空间 BGR 到 HSV
        hsv_img = cv.cvtColor(frame, cv.COLOR_BGR2HSV)

        # 设置HSV的阈值使得只取指定颜色
        mask = cv.inRange(hsv_img, lower_hsv, higher_hsv)

        # 将掩膜和图像逐像素相加
        res = cv.bitwise_and(frame,frame, mask= mask)

        cv.imshow("mask",mask)
        cv.imshow("frame",frame)
        cv.imshow("res",res)

        # 每5ms读取一帧
        if cv.waitKey(5) == 27:
            break

    cv.destroyAllWindows()
      
if __name__ == "__main__":
    test()

2.3 代码分析

  1. 用户输入要跟踪物体颜色的 bgr 表示

    注意是 BGR 值而不是 RGB值,通常可以通过截屏软件得到某物体的RGB值,此时要将得到的数组的第一项和第三项的值换一下再作为程序的输入。

  2. 程序将得到的BGR值转换为hsv值
    color = eval(input("请输入追踪的颜色bgr表示:"))
    target_hsv = cv.cvtColor(np.uint8(color).reshape((1,1,3)),cv.COLOR_BGR2HSV)
    
  3. 把[H- 10,40,40]和[H+ 10,255, 255]分别作为下界和上界。
    target_hsv = target_hsv.flatten()
    BOUND = 10
    lower_hsv = np.array([target_hsv[0]-BOUND,40,40])
    higher_hsv = np.array([target_hsv[0]+BOUND,255,255])
    
  4. 读入视频流
    cap = cv.VideoCapture("videos/green_ball.mp4")
    
  5. 每5ms读入一帧图像进行处理
    (1)将该帧图像由BGR空间转换到HSV空间;
    (2)根据HSV的阈值使得只取指定颜色;
    (3)将掩膜和图像逐像素相加;
    while True:
    	# 读取帧
    	ret, frame = cap.read()
        if not ret:break
    	
    	# 转换颜色空间 BGR 到 HSV
    	hsv_img = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
    	
    	# 根据HSV的阈值使得只取指定颜色
    	mask = cv.inRange(hsv_img, lower_hsv, higher_hsv)
    	
    	# 将掩膜和图像逐像素相加
    	res = cv.bitwise_and(frame,frame, mask= mask)
    	
    	cv.imshow("mask",mask)
    	cv.imshow("frame",frame)
    	cv.imshow("res",res)
    	
    	# 每5ms读取一帧
    	if cv.waitKey(5) == 27:
    	    break
    

2.4 程序演示

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值