目标
- 在本教程中,你将学习如何将图像从一个颜色空间转换为另一个颜色空间,如 BGR \(\leftrightarrow\) 灰度,BGR \(\leftrightarrow\) HSV 等。
- 除此之外,我们还将创建一个应用程序来提取视频中的彩色物体
- 你将学习以下函数: cv.cvtColor(), cv.inRange() 等。
更改颜色空间
OpenCV 中有超过 150 种颜色空间转换方法。但我们只研究其中两种,即使用最广泛的两种:BGR \(\leftrightarrow\) 灰度和 BGR \(\leftrightarrow\) HSV。
对于颜色转换,我们使用函数 cv.cvtColor(input_image, flag),其中 flag 确定转换类型。
对于 BGR \(\rightarrow\) 灰度转换,我们使用标志 cv.COLOR_BGR2GRAY。类似地,对于 BGR \(\rightarrow\) HSV,我们使用标志 cv.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 图像进行蓝色范围的阈值处理
- 现在提取蓝色对象,我们可以对该图像执行任何我们想要的操作。
以下列出注释详尽的代码
导入 cv2 as cv
导入 numpy as np
while(1)
_, frame = cap.read()
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
如果 k == 27
中断
从视频文件、图像序列或摄像头拍摄视频的类。
定义 videoio.hpp:731
void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst)
检查数组元素是否介于其他两个数组的元素之间。
void bitwise_and(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray())
计算两个数组的按位合取 (dst = src1 & src2) 计算每个元素按位...
void imshow(const String &winname, InputArray mat)
在指定窗口中显示图像。
int waitKey(int delay=0)
等待按下按键。
void destroyAllWindows()
销毁所有 HighGUI 窗口。
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0)
将图像从一种颜色空间转换为另一种颜色空间。
下图显示蓝色对象的追踪
image
- 注意
- 图像中存在一些噪音。我们将在后续章节中了解如何消除噪音。
- 这是对象跟踪中最简单的方法。一旦你了解轮廓函数,你就可以做很多事情,比如找到对象的质心并使用它来跟踪对象、通过在摄像头前移动你的手来绘制图表,以及其他有趣的事情。
如何找到要跟踪的 HSV 值?
这是 stackoverflow.com 中常见的疑问。它非常简单,您可以使用相同的函数 cv.cvtColor()。您只需传递需要的 BGR 值,而不是传递图像。例如,若要找到绿色的 HSV 值,请在 Python 终端中尝试以下命令
>>> green = np.uint8([[[0,255,0 ]]])
>>> print( hsv_green )
[[[ 60 255 255]]]
现在,您可以分别将 [H-10, 100,100] 和 [H+10, 255, 255] 用作下限和上限。除了这种方法,您可以使用 GIMP 等图像编辑工具或任何在线转换器来查找这些值,但请别忘记调整 HSV 范围。
其他资源
练习
- 尝试寻找一种方法来提取多个彩色对象,例如,同时提取红色、蓝色和绿色对象。