转换颜色空间
在OpenCV 中有超过150 中进行颜色空间转换的方法。但是你以后就会
发现我们经常用到的也就两种:BGR<->Gray 和BGR<->HSV。
我们要用到的函数是:cv2.cvtColor(input_image,flag),其中flag
就是转换类型。
对于BGR<->Gray 的转换,我们要使用的flag 就是cv2.COLOR_BGR2GRAY。
同样对于BGR<->HSV 的转换,我们用的flag 就是cv2.COLOR_BGR2HSV。
你还可以通过下面的命令得到所有可用的flag。
import numpy as np
import cv2
from matplotlib import pyplot as plt
import matplotlib.image as mpimg # mpimg 用于读取图片
flags=[i for i in dir(cv2) if i.startswith('COLOR_')]
#str.startswith()函数:用于判断一个字符串是否为某个字符串的开头
#dir()函数:带参数时,返回参数的属性、方法列表
print(flags)
物体跟踪
现在我们知道怎样将一幅图像从BGR 转换到HSV 了,我们可以利用这
一点来提取带有某个特定颜色的物体。在HSV 颜色空间中要比在BGR 空间
中更容易表示一个特定颜色。在我们的程序中,我们要提取的是一个蓝色的物体。下面就是就是我们要做的几步:
• 从视频中获取每一帧图像
• 将图像转换到HSV 空间
• 设置HSV 阈值到蓝色范围。
• 获取蓝色物体,当然我们还可以做其他任何我们想做的事,比如:在蓝色物体周围画一个圈。
import numpy as np
import cv2
from matplotlib import pyplot as plt
import matplotlib.image as mpimg # mpimg 用于读取图片
cap=cv2.VideoCapture(0)
while(1):
#获取每一帧
ret,frame=cap.read()
#转换到HSV
hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
#设定蓝色的阈值
lower_blue=np.array([110,50,50])
upper_blue=np.array([130,255,255])
#根据阈值构建掩模
mask=cv2.inRange(hsv,lower_blue,upper_blue)
#第一个参数:hsv指的是原图
#第二个参数:lower_red指的是图像中低于这个lower_red的值,图像值变为0
#第三个参数:upper_red指的是图像中高于这个upper_red的值,图像值变为0
#而在lower_red~upper_red之间的值变成255
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 值?
函数cv2.cvtColor() 也可以用到这里。但是现在你要传入的参数是(你想要的)BGR 值而不是一副图。例如,我们要找到绿色的HSV 值,我们只需在终端输入以下命令:
import numpy as np
import cv2
from matplotlib import pyplot as plt
import matplotlib.image as mpimg # mpimg 用于读取图片
green=np.uint8([0,255,0])
hsv_green=cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
所以不能用[0,255,0],而要用[[[0,255,0]]]
这里的三层括号应该分别对应于cvArray,cvMat,IplImage
import numpy as np
import cv2
from matplotlib import pyplot as plt
import matplotlib.image as mpimg # mpimg 用于读取图片
green=np.uint8([[[0,255,0]]])
hsv_green=cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
print(hsv_green)
现在你可以分别用[H-100,100,100] 和[H+100,255,255] 做上下阈值。除了这个方法之外,你可以使用任何其他图像编辑软件(例如GIMP)或者在线转换软件找到相应的HSV 值,但是最后别忘了调节HSV 的范围。