Opencv(二)-图像处理

颜色空间转换

目标:

  • 你将学习如何对图像进行颜色空间转换,比如从 BGR 到灰度图,或者从BGR 到 HSV 等。

  • 我没还要创建一个程序用来从一幅图像中获取某个特定颜色的物体。

  • 我们将要学习的函数有:cv2.cvtColor(),cv2.inRange() 等。

1、转换颜色空间

  在 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。

1
2
3
import cv2
flags=[i for in dir(cv2) if i startswith('COLOR_')]
print flags

注意:在 OpenCV 的 HSV 格式中,H(色彩/色度)的取值范围是 [0,179],S(饱和度)的取值范围 [0,255],V(亮度)的取值范围 [0,255]。

2、物体跟踪

现在我们知道怎样将一幅图像从 BGR 转换到 HSV 了,我们可以利用这一点来提取带有某个特定颜色的物体。在 HSV 颜色空间中要比在 BGR 空间中更容易表示一个特定颜色。在我们的程序中,我们要提取的是一个蓝色的物体。下面就是就是我们要做的几步:

  • 从视频中获取每一帧图像
  • 将图像转换到HSV空间
  • 设置HSV阈值到蓝色范围
  • 获取蓝色物体

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import cv2
import numpy as np

cap = cv2.VideoCapture(0)
#蓝色的BGR阈值
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,225,225])
while True:
ret, frame = cap.read()
#转换为HSV图
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, lower_blue, upper_blue)
res = cv2.bitwise_and(frame, frame, mask=mask)
#cv2.imshow('mask', mask)
cv2.imshow('res', res)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()

注意

  1. cv2.inRange函数用于设阈值,去除背景部分,只保留蓝色物体部分。
  2. 从cv2.bitwise_and是对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作。前两个参数是“与”操作的操作对象,mask参数指定使用的模板。

结果如下:

GQ12tg.png

3、怎样找到要跟踪对象的HSV值

​ 函数 cv2.cvtColor() 也可以用到这里。但是现在你要传入的参数是(你想要的)BGR 值而不是一副图。例如,我们要找到绿色的 HSV 值,我们只需在终端输入以下命令:

1
2
3
4
5
import cv2
import numpy as np
green = np.uint8([[[0,225,0]]])
green_hsv = cv2.cvtColor(green, cv2.COLOR_BGR2HSV)
print(green_hsv)

现在你可以分别用 [H-10,100,100] 和 [H+10,255,255] 做上下阈值。

点击了解更多!