OpenCV库的学习笔记(三)Changing Colorspaces

目标:

  • 在本教程中,您将学习如何将图像从一种颜色空间转换为另一种颜色空间,如 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 颜色空间中更容易。在我们的应用程序中,我们将尝试提取蓝色对象。所以这是方法:

  1. 拍摄视频的每一帧;
  2. 从 BGR 转换为 HSV 颜色空间;
  3. 我们对一系列蓝色的 HSV 图像进行阈值处理;
  4. 现在单独提取蓝色对象,我们可以对该图像做任何我们想做的事情。

下面是详细注释的代码:

import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)
while(1):
    # Take each frame
    _, frame = cap.read()
    # Convert BGR to HSV
    hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
    # define range of blue color in HSV
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])
    # Threshold the HSV image to get only blue colors
    mask = cv.inRange(hsv, lower_blue, upper_blue)
    # Bitwise-AND mask and original image
    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
cv.destroyAllWindows()

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

OpenCV库的学习笔记(三)Changing Colorspaces_第1张图片

图像中有一些噪点。我们将在后面的章节中看到如何删除它。

这是对象跟踪中最简单的方法。一旦你学会了轮廓的功能,你就可以做很多事情,比如找到一个物体的质心并用它来跟踪物体,只需在相机前移动你的手就可以画出图表,以及其他有趣的事情。

如何找到要跟踪的 HSV 值?

这是在 stackoverflow.com 中发现的一个常见问题。它非常简单,您可以使用相同的函数 cv.cvtColor()。您无需传递图像,只需传递所需的 BGR 值即可。例如,要查找 Green 的 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 范围。

作业

尝试找到一种方法来提取多个颜色的对象,例如同时提取红色、蓝色和绿色对象?

这块内容由于我没有摄像头所以没有实践来做,这块内容可以调整色调和饱和度,即HSI的前两个参数来进行同时跟踪,HSI具体参数如下所示:

  • 色调H(Hue):与光波的频率有关,它表示人的感官对不同颜色的感受,如红色、绿色、蓝色等,它也可表示一定范围的颜色,如暖色、冷色等。
  • 饱和度S(Saturation):表示颜色的纯度,纯光谱色是完全饱和的,加入白光会稀释饱和度。饱和度越大,颜色看起来就会越鲜艳,反之亦然。
  • 亮度I(Intensity):对应成像亮度和图像灰度,是颜色的明亮程度。

你可能感兴趣的:(opencv,学习,人工智能)