》》收藏+关注,理财&技术不迷路《《
目录:
先总结:
色彩空间种类和定义的理论掌握
转换方法:XXX = cv.cvtColor(image, cv.COLOR_BGR2XXX)
调用opencv内部函数都属于调用他的API接口
视频输入读取: capture = cv.VideoCapture(“ ”)
ret, frame = capture.read()
第一个参数ret 为True 或者False,代表有没有读取到图片, ret是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。
第二个参数frame表示截取到一帧的图片,frame就是每一帧的图像,是个三维矩阵.
通过hsv来追踪颜色:
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
lower_hsv = np.array([0,0,221])
upper_hsv = np.array([180,30,255])
# 这里追踪白色,得到的是一个二值图像
mask = cv.inRange(hsv,lowerb=lower_hsv,upperb=upper_hsv)
通道分割与合并:
分割:r, g, b = cv.split(src)
单独修改某个通道:src[ :, :, 0/1/2 ] = 0/?
合并:cv.merge( [r, g, b] )
4.1 定义及空间种类
纯黑:0 0 0
纯白:255, 255, 255
三原色:红、绿、蓝,这三种光波是自然界所有颜色的基础,任何颜色都可以由这三种颜色混合而来。
每种颜色按亮度分为0~255共256个等级(不了解亮度可以看第一节),0表示亮度为0%,255表示亮度为100%,这是我们首先要知道的,数值表示的是颜色的亮度。
三种颜色的不同亮度相互组合成立大千世界,这些数值可以表示256*256*256=1678万中颜色,对于电脑再现大千世界绰绰有余了。但为什么是255呢,这关于到色彩位数2^8=256,,表示这是8位色彩深度,色彩深度是计算机图形学领域表示在位图或者视频帧缓冲区中储存1像素的颜色所用的位数,位数越多,能表示的颜色越多。
HSV:
H:hue 色调
为什么还要用HSV来表示?因为HSV在差异性很大的色彩中很好用,他能很大的突出途中某些很突出的颜色
HSV: H: 0-360. SV:0-255.
但是实际中opencv H是0-180, 因为其他都是0-255, 所以用uint8 , 2的8次就可以表示,但是要是到360的话就会溢出。所以缩小取值范围让它满足取值范围。
HIS:I:intensive 灰度级别。S:Saturation 饱和度
YCrCb:多用于检测皮肤
YUV:Android开发。
4.2 RGB转化为其他:
重点:RGB —— HSV!!!!
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV)
yuv = cv.cvtColor(image, cv.COLOR_BGR2YUV)
Ycrcb = cv.cvtColor(image, cv.COLOR_BGR2YCrCb)
………………...
上面表格中在色彩空间里面都特别容易区分,所以我们用 inRange 来区分,能直接把这些颜色的HSV值提取出来。
比如某个像素点 他的坐标都位于 黑色的HSV 区域,那么这个像素点一定是黑色。
这个表格是经验总结表,很重要:!!!!
比如你想提取图中所有黄色点,那么满足 h [26, 34], s [43, 255], v[46, 255] 这三个要求的所有点都可以提取为黄色。上面三个通道,最大值最小值总6个值,就可以过滤出所有黄色的点了。
做颜色物体跟踪的关键!!
4.3 通过hsv追踪颜色(cv.irange(hsv, 下限,上限))
通过hsv追踪的最后都是二值图,你追踪的颜色就是白色,没追踪的全部为黑色。
这里牢牢的追踪了白色。
4.4 通道的分割与合并
cv2.split函数分离得到各个通道的灰度值(单通道图像)。
改变某个单独通道的值:
通过merge()来合并:
cv2.merge函数是合并单通道成多通道(不能合并多个多通道图像)。