OpenCV 4.12.0
开源计算机视觉
加载中...
搜索中...
无匹配项
颜色空间转换

目标

  • 在本教程中,您将学习如何将图像从一个颜色空间转换为另一个颜色空间,例如 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()
# 将 BGR 转换为 HSV
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
# 定义 HSV 中蓝色的范围
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
# 对 HSV 图像进行阈值处理,只获取蓝色
mask = cv.inRange(hsv, lower_blue, upper_blue)
# 按位与掩码和原始图像
res = cv.bitwise_and(frame,frame, mask= mask)
cv.imshow('frame',frame)
cv.imshow('mask',mask)
cv.imshow('res',res)
k = cv.waitKey(5) & 0xFF
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 ]]])
>>> hsv_green = cv.cvtColor(green,cv.COLOR_BGR2HSV)
>>> print( hsv_green )
[[[ 60 255 255]]]

现在您将 [H-10, 100,100] 和 [H+10, 255, 255] 分别作为下限和上限。除了此方法,您还可以使用任何图像编辑工具(如 GIMP)或任何在线转换器来查找这些值,但不要忘记调整 HSV 范围。

练习

  1. 尝试找到一种方法来提取多个彩色对象,例如,同时提取红色、蓝色和绿色对象。