目标:
·如何把图片从一个彩色空间转换到别的,比如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
>>>flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
>>>print flags
注意:
对于HSV, 色彩空间是[0, 179],饱和度空间是[0, 255]而值空间是[0, 255]。不同软件使用不同的标量。所以如果你要比较OpenCV的值你需要统一这些值域。
物体跟踪
现在我们知道如何去把BGR图片转换成HSV,我们可以用这个来分解出彩色物体。在HSV里,要表现一个颜色要比RGB空间要简单。在我们的应用里,我们会尝试分解出一个蓝色物体,这里是方法:
·从视频里取出每一帧
·把BGR转换到HSV
·我们在HSV图片里设置一个色彩阈值来过滤蓝色
·现在我们只把蓝色物体分解出来,我们可以对那个图片按自己的需要处理。
下面是代码:
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
while(1):
# Take each frame
_,frame = cap.read()
# Convert BGR to HSV
hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
# define range of blue color in HSV
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
# Threshold the HSV image to get only blue colors
mask = cv2.inRange(hsv,lower_blue,upper_blue)
# Bitwise-AND mask and original image
res = cv2.bitwise_and(frame,frame,mask=mask)
cv2.imshow('frame',frame)
cv2.imshow('mask',mask)
cv2.imshow('res',res)
k = cv2.waitKey(5) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
注意:
在图片里会有一些噪音。
注意:
这是最简单的物体跟踪的办法。当你学了其他轮廓线方法,你可以做很多事情了,比如找到这个物体的重心,用它来跟踪物体,在摄像头前只移动手就能画出图来,等等他有意思的事情。
如何找到要跟踪的HSV值
这是stackoverflow.com上最常见的问题。其实十分简单,你可以使用这个函数: cv2.cvtColor()。你可以传一个BGR值而不用传一个图片,比如,要找到绿色的HSV值,用下面的命令:
>>>green = np.uint8([[[0,255,0]]])
>>>hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
>>>print hsv_green
[[[ 60 255 255]]]
现在你拿到了[h-10, 100, 100]和[H+10, 255,255]作为下限和上限。除了这个方法以外,你可以使用任何图片编辑工具,比如GIMP或者其他在线转换器来找到这些值,但是不要忘了调整HSV值域。