OpenCV学习:物体跟踪

HSV是一种将RGB色彩模型中的点在圆柱坐标系中的表示法。这种表示法试图做到比RGB基于笛卡尔坐标系的几何结构更加直观。HSV即色相、饱和度、明度(英语:Hue, Saturation, Value),又称HSB,其中B即英语:Brightness。[1]

在HSV颜色空间中,比在RGB颜色空间中更容易表示一种特定颜色,所以我们利用这一点可以更容易地提取带有某个特定颜色的物体。通过如下几步可以进行简单的物体跟踪

  • 从视频中获取每一帧图像
  • 将图像转换到 HSV 空间
  • 设置 HSV 阈值到蓝色范围

结果如下图所示:

                      图1                                                                                       图2

                        图3

import numpy as np
import cv2

#cv2.cvtColor(input_image ,flag) #其中 flag就是转换类型。
#BGR↔Gray 的转换,我们要使用的 flag 就是 cv2.COLOR_BGR2GRAY。
#同样对于 BGR↔HSV 的转换,我们用的 flag 就是 cv2.COLOR_BGR2HSV。

#flags=[i for in dir(cv2) if i startswith('COLOR_')]
#print(flags)  #通过这两行命令得到所有可用flag
#注意:在 OpenCV 的 HSV 格式中,H(色彩/色度)的取值范围是 [0,179],S(饱和度)的取值范围 [0,255],V(亮度)的取值范围 [0,255]。
# 但是不同的软件使用的值可能不同。所以当你需要拿 OpenCV 的 HSV 值与其他软件的 HSV 值进行对比时,一定要记得归一化。

#HSV 色彩/色度/色相[0,179]   饱和度[0,255]   亮度[0,255]


#物体追踪
cap=cv2.VideoCapture(0)
while(1):
    #获取每一帧
    ret,frame=cap.read()
    
    #转换到HSV,HSV里面颜色区别更大
    hsv=cv2.cvtColor(frame,cv2.COLOR_RGB2HSV)
    #cv2.imshow('hsv',hsv)
    
    #设定蓝色的阈值
    lower_blue=np.array([11,43,46])
    upper_blue=np.array([25,255,255])
    #理论上蓝色H范围100-124,实际在11-25(橙)范围找到了蓝色物体,猜想是日光灯的原因。
    
    #根据阈值构建掩模
    mask=cv2.inRange(hsv,lower_blue,upper_blue)#保留阈值范围内,去除背景
    
    #对原图像和掩模进行位运算
    res=cv2.bitwise_and(frame,frame,mask=mask)#bitwise_and(src1, src2, dst=None, mask=None),矩阵1,矩阵2
    #掩模 相当于PCB制版里面的 底片
    
    #显示图像
    cv2.imshow('frame',frame)
    cv2.imshow('mask',mask)
    cv2.imshow('res',res)
    k=cv2.waitKey(5)&0xFF
    if k ==27:
        break

cv2.destroyAllWindows()

说明:参考文章HSV颜色识别-HSV基本颜色分量范围确定蓝色的HSV区间,结果发现并不能检测出想要的结果,最后不断调整区间在色相区间[11,25]内有较好结果,还不知道是哪里不准确,怀疑是实验室的灯光的原因,有了解的朋友可以留言。


Reference:

[1] HSL和HSV色彩空间. (2018, March 12). Retrieved from 维基百科, 自由的百科全书: https://zh.wikipedia.org/w/index.php?title=HSL%E5%92%8CHSV%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4&oldid=48639745


猜你喜欢

转载自blog.csdn.net/mao_jonah/article/details/80107888