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

目标

  • 在本教程中,您将学习如何将图像从一个颜色空间转换为另一个颜色空间,例如BGR ↔ Gray,BGR ↔ HSV等。
  • 此外,我们将创建一个应用程序来提取视频中的彩色物体。
  • 您将学习以下函数:cv.cvtColor()cv.inRange()等。

颜色空间转换

OpenCV中提供了超过150种颜色空间转换方法。但我们将只关注两种最常用的方法:BGR ↔ Gray和BGR ↔ HSV。

对于颜色转换,我们使用函数cv.cvtColor(input_image, flag),其中flag决定转换的类型。

对于BGR → Gray转换,我们使用标志cv.COLOR_BGR2GRAY。类似地,对于BGR → 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
用于从视频文件、图像序列或摄像头捕获视频的类。
定义 videoio.hpp:766
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)
将图像从一个颜色空间转换为另一个颜色空间。

下图显示了蓝色物体的跟踪

图像
注意
图像中有一些噪点。我们将在后面的章节中学习如何去除它们。
这是物体跟踪中最简单的方法。一旦您学习了轮廓函数,您可以做很多事情,例如找到物体的质心并用它来跟踪物体,只需在摄像头前移动您的手就可以绘制图表,以及其他有趣的事情。

如何找到用于跟踪的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. 尝试找到一种方法来提取多个彩色物体,例如,同时提取红色、蓝色和绿色物体。