在opencv中,硬件所使用的颜色顺序为BGR,而非RGB,虽然排序有所不同,但是在进行图像操作的时候会有很大的区别,BGR颜色空间分别对应蓝、绿、红;这三种颜色的排列组合可以组成人眼所看到的所有颜色,如图2.1:
HSV分别对应色度、饱和度、亮度,HSV颜色空间数据分明,适合计算机处理数据,HSV是一种比较直观的颜色模型,所以在许多图像编辑工具中应用比较广泛。因此,一般在做图像处理的时候,都会把BGR转化成HSV[3]。其表示如图2.2:
三、API:cv.cvtColor 色彩空间转化API
第一个参数frame是图片数据,第二个参数为转化参数有
cv.COLOR_BGR2GRAY:BGR转灰色空间,就是灰白图片
cv.COLOR_BGR2HSV:BGR转HSV
cv.COLOR_BGR2YUV :BGR转YUV色彩空间
这些参数中把其中颜色空间的顺序调换就可以转回BGR,如cv.COLOR_GRAY2BGR
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
四、颜色追踪(物体追踪)
1.定义掩摸(面具)mask
HSV颜色取值范围表
黑 |
灰 |
白 |
红 |
橙 |
黄 |
绿 |
青 |
蓝 |
||
hmin |
0 |
0 |
0 |
0 |
156 |
11 |
26 |
35 |
78 |
100 |
hmax |
180 |
180 |
180 |
10 |
180 |
25 |
34 |
77 |
99 |
124 |
smin |
0 |
0 |
0 |
43 |
43 |
43 |
43 |
43 |
43 |
43 |
smax |
255 |
43 |
30 |
255 |
255 |
255 |
255 |
255 |
255 |
255 |
vmin |
0 |
46 |
221 |
46 |
46 |
46 |
46 |
46 |
46 |
46 |
vmax |
46 |
220 |
255 |
255 |
255 |
255 |
255 |
255 |
255 |
255 |
mask = cv.inRange(hsv, lowerb = lower_hsv, upperb = upper_hsv)
cv.inRange:确定颜色取值的范围(下面是红色的HSV颜色范围取值)
lower_hsv = np.array([156, 43, 46]) #定义hsv空间的三个最低值
upper_hsv = np.array([180, 255, 255]) #定义hsv空间的三个最高值
cv.bitwise_and:逻辑与,就是把他里面所有的参数都相与
cv.bitwise_and(frame, frame, mask=mask)
之后调用摄像头只直接显示就可以了,完整代码如下
def extrace_object_demo():
capture = cv.VideoCapture(0)
while(True):
ret, frame = capture.read()
if ret == False:
break
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
lower_hsv = np.array([156, 43, 46]) #定义hsv空间的三个最低值
upper_hsv = np.array([180, 255, 255]) #定义hsv空间的三个最高值
mask = cv.inRange(hsv, lowerb = lower_hsv, upperb = upper_hsv) #inRange取颜色范围,,现取红色区域
cv.imshow("video", hsv) #显示hsv图像
red_mask = cv.bitwise_and(frame, frame, mask=mask) #使用逻辑与取出红色区域
cv.imshow("new video", red_mask) #显示图像中的红色区域
c = cv.waitKey(40)
if c == 27:
break
extrace_object_demo()
cv.waitKey(0)
cv.destroyAllWindows()
实验结果(我这里不使用摄像头了,我网上找了一个穿红衣服跳舞的视频)
视频我放在根目录下,只是把摄像头0改成了视频路径,更改的代码
capture = cv.VideoCapture('3.mkv')
五、肤色追踪(人脸检测)
黄色人体肤色范围
lower_red=np.array([0,30,60])
upper_red=np.array([20,150,255])
然后把这些数值带入上面的代码就可以了
实验结果就不放出来了,人长得丑,自己实验就知道了。