'''
摄像头物体追踪-红色瓶盖
RGB色彩空间的基础是对叠加型三原色(红、绿、蓝)的应用。之所以选择它们,是因为把它们组合起来后可以产生色域很宽
的各种颜色。实际上,人类的视觉系统也是基于对三原色的感知,因为视锥细胞的灵敏度位于红绿蓝的光谱周围。这通常是数
字成像中默认的色彩空间,因为这就是人类看数字图像的方式。捕捉到的光线穿过红绿蓝三种滤波器,并且在数字图像中会对
红绿蓝三个通道做校正,当三种颜色强度相同时就会取得灰度,即从黑色(0, 0, 0)到白色(255,255, 255)。
但是,利用RGB色彩空间计算颜色之间的差距,并不是衡量两个颜色相似度的最好方式。实际上RGB并不是感知均匀的色彩空
间。就是说,两种具有一定差距的颜色可能看起来非常接近,而另外两种具有同样差距的颜色看起来却差别很大。
HSV和HLS这两种色彩空间很有意思,它们把颜色分解成加值的色调和饱和度组件或亮度组件。人类用这种方式来描述颜色会
更加自然。
'''
import numpy as np
import cv2 as cv
import time
#为了获取视频,创建一个 VideoCapture 对象。它参数可以是设备的索引号,或者是一个视频文件。设备索引号就是在
#指定要使用的摄像头。一般的笔记本电脑都有内置摄像头。所以参数就是 0。你可以通过设置成 1 或者其他的来选择别的摄像头。
cap = cv.VideoCapture(0)
#根据上面的方法设定红色的阈值
lower_red = np.array([71,57,128])
upper_red = np.array([215,179,255])
i=1
#死循环
while(1):
##摄像头逐帧捕捉,ret是返回状态,frame是视频帧
ret,frame = cap.read()
'''这一段是为了确认被追踪物体颜色,将被追踪物体(比如农夫山泉红色的瓶盖)放在摄像头下,摄像头一秒钟保存一次
图像,然后用WIN自带画图工具打开图片,鼠标移动到图像红色瓶盖最亮部分,左下角会显示像素坐标位置如(439,263),
获取图像该坐标颜色通道值 >>>img[263,439] array([215, 179, 225], dtype=uint8)。再移动到图像红色瓶盖最暗部分,
获取颜色通道值。
time.sleep(1)
savefile = str(i)+'.jpg'
i += 1
cv.imwrite(savefile,frame)
'''
#颜色空间转换成HSV
hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV)
#根据阈值构建掩膜
mask = cv.inRange(hsv,lower_red,upper_red)
#对原图像和掩膜进行位运算
res = cv.bitwise_and(frame,frame,mask = mask)
#显示图像
cv.imshow('frame',frame)
cv.imshow('mask',mask)
cv.imshow('res',res)
#按q键后退出
if cv.waitKey(1) & 0xFF == ord('q'):
break
#释放摄像头
cap.release()
#关闭窗口
cv.destroyAllWindows()
##原始图像
##掩膜图像
##最后识别出的图像