目标
- 在本教程中,您将学习如何将图像从一个颜色空间转换为另一个颜色空间,例如 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 图像进行阈值处理,以获得蓝色范围
- 现在单独提取蓝色对象,我们可以在该图像上做任何我们想做的事情。
下面是详细注释的代码
import cv2 as cv
import numpy as np
while(1)
_, frame = cap.read()
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
if k == 27
break
用于从视频文件、图像序列或相机捕获视频的类。
Definition videoio.hpp:772
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, AlgorithmHint hint=cv::ALGO_HINT_DEFAULT)
将图像从一个颜色空间转换为另一个颜色空间。
下图显示了蓝色对象的跟踪
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 范围。
练习
- 尝试找到一种方法来提取多个彩色对象,例如,同时提取红色、蓝色和绿色对象。