目标
- 在这一节中,将要学习如何将一张图像从一个色度空间变换到另一个,例如BGR-Gray,BGR-HSV等
- 将创建一个应用从一个视频中抽取一个有颜色的对象
- 掌握函数:cv2.cvtColor(), cv2.inRange()等
变换色度空间
在OpenCV中,提供了超过150种色度空间变换方法。但是这里我们将只学习两种最常用的变换,BGR-Gray和BGR-HSV。
对于图像转换,我们使用函数cv2.cvtColor(input_image, flag),其中flag确定转换类型。
对于BGR—>Gray变换,我们使用标志符cv2.COLOR_BGR2GRAY。相似地,对于BGR—>HSV,我们使用标识符cv2.COLOR_BGR2HSV。如果要获得所有的标识符,我们可以在Python终端中输入下面的命令。
>>> import cv2 as cv
>>> flags = [i for i in dir(cv) if i.startswith('COLOR_')]
>>> print( flags )
注意:对于HSV空间,色相范围为[0, 179],饱和度范围为[0, 255],强度值范围为[0, 255]。不同的软件会使用不同的范围,因此,如果我们和其他软件对比OpenCV的时候,最好将这些范围归一化。
目标追踪
现在我们已经知道了如何将一个BGR图像转换为HSV图像了,那我们可以使用这个功能去提取一个有颜色的对象。在HSV空间中,会比BGR颜色空间更加容易表示一种颜色。在这个应用中,我们将提取出一个蓝色物体。具体方法如下:
- 从视频中提取一帧图像
- 从BGR空间变换到HSV空间
- 对HSV图像进行阈值分割,分割范围为蓝色
- 单独提取出蓝色物体
代码如下:
import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)
while(1):
# 提取每一帧
_, frame = cap.read()
# 从BGR变换为HSV
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
# 在HSV中定义蓝色范围
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
# 根据给定的蓝色范围对HSV图像进行阈值分割
mask = cv.inRange(hsv, lower_blue, upper_blue)
# Bitwise-AND掩膜与原始图像
res = cv.bitwise_and(frame,frame, mask= mask)
cv.imshow('frame',frame)
cv.imshow('mask',mask)
cv.imshow('res',res)
k = cv.waitKey(5) & 0xFF
if k == 27:
break
cv.destroyAllWindows()
下图是追踪蓝色物体的结果

注意:在图像中有一些噪声,后面的章节中将学习如何去除噪声。这是追踪对象的最简单的方法,如果你学习了边缘函数,则可以实现其他很多功能,比如找到一个物体的中心,追踪对象,在摄像头前仅仅通过移动手来画图等。
如何找到用来追踪的HSV值?
同样使用函数cv2.cvtColor(),这里不是传递一张图片,而是传递你想要的BGR值。例如,如果要找到绿色的HSV值,可以使用下面的命令:
>>> green = np.uint8([[[0,255,0 ]]])
>>> hsv_green = cv.cvtColor(green,cv.COLOR_BGR2HSV)
>>> print( hsv_green )
[[[ 60 255 255]]]
接下来,可以将[H-10, 100,100]和[H+10, 255, 255]分别作为下边界和上边界。除了这个方法外,你也可以使用其他任意的图像编辑工具比如GIMP,或者在线工具转换这些值,但是要注意调整HSV范围。
本文介绍如何使用OpenCV进行色彩空间变换,并演示了从视频中提取特定颜色对象的应用实例,包括BGR到HSV的转换及目标追踪的技术细节。
1856

被折叠的 条评论
为什么被折叠?



