OpenCV竟然可以这样学!成神之路终将不远(九)

简介: OpenCV竟然可以这样学!成神之路终将不远(九)

 返回目录

目录

9 改变颜色空间

9.1 目标

9.2 改变颜色空间

9.3 对象追踪

9.4 如何找到要追踪的HSV值?

9.5 练习题


9 改变颜色空间

9.1 目标

    • 在本教程中,你将学习如何将图像从一个色彩空间转换到另一个,像BGR↔灰色,BGR↔HSV等
    • 除此之外,我们还将创建一个应用程序,以提取视频中的彩色对象。
    • 你将学习以下功能:cv.cvtColorcv.inRange等。

    9.2 改变颜色空间

    OpenCV中有超过150种颜色空间转换方法。但是我们将研究只有两个最广泛使用的,BGR↔灰色和BGR↔HSV。

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

    对于BGR→灰度转换,我们使用标志cv.COLOR_BGR2GRAY。类似地,对于BGR→HSV,我们使用标志cv.COLOR_BGR2HSV。要获取其他标记,只需在Python终端中运行以下命令:

    注意:HSV的色相范围为[0,179],饱和度范围为[0,255],值范围为[0,255]。不同的软件使用不同的规模。因此,如果你要将OpenCV值和它们比较,你需要将这些范围标准化。

    9.3 对象追踪

    现在我们知道了如何将BGR图像转换成HSV,我们可以使用它来提取一个有颜色的对象。在HSV中比在BGR颜色空间中更容易表示颜色。在我们的应用程序中,我们将尝试提取一个绿色的对象。方法如下: - 取视频的每一帧 - 转换从BGR到HSV颜色空间 - 我们对HSV图像设置绿色范围的阈值 - 现在单独提取绿色对象,我们可以对图像做任何我们想做的事情。

    这里附上HSV一些常见的颜色阈值:

    绿

    hmin

    0

    0

    0

    0

    156

    11

    26

    35

    78

    100

    125

    hmax

    180

    180

    180

    10

    180

    25

    34;

    77

    99

    124

    155

    smin

    0

    0

    0

    43

    43

    43

    43

    43

    43

    43

    smax

    255

    43

    30

    255

    255

    255

    255

    255

    255

    255

    vmin

    0

    46

    221

    46

    46

    46

    46

    46

    46

    46

    vmax

    46

    220

    255

    255

    255

    255

    255

    255

    255

    255

    下面是详细注释的代码:

    import cv2 as cv
    import numpy as np
    cap = cv.VideoCapture('../video/7.mp4')
    while True:  # 我这里用的是Python3,所以True和1效率都一样,在Python2中,1效率更高
        # 读取帧
        _, frame = cap.read()
        # 转换颜色空间BGR到HSV
        hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
        # 定义HSV中绿色的范围
        lower_green = np.array([35, 43, 46])
        upper_green = np.array([77, 255, 255])
        # 设置HSV的阈值使得只取绿色
        mask = cv.inRange(hsv, lower_green, upper_green)
        # 将掩码和图像逐像素相加
        dst = cv.bitwise_and(frame, frame, mask=mask)
        cv.imshow('frame', frame)
        cv.imshow('mask', mask)
        cv.imshow('dst', dst)
        if cv.waitKey(18) & 0xFF == 27:
            break
    cv.destroyAllWindows()

    image.gif

    下图显示了对绿色对象的跟踪:

    image.gif编辑

    注意:图像中有一些噪点。我们将在后面的章节中看到如何删除它们。 这是对象跟踪中最简单的方法。一旦学习了轮廓的功能,你就可以做很多事情,例如找到该对象的质心并使用它来跟踪对象,仅通过将手移到相机前面以及其他许多有趣的东西就可以绘制图表。

    9.4 如何找到要追踪的HSV值?

    这是在stackoverflow.com上发现的一个常见问题。它非常简单,你可以使用相同的函数cv.cvtColor()。你只需传递你想要的BGR值,而不是传递图像。例如,要查找绿色的HSV值,请在Python终端中尝试以下命令:

    import cv2 as cv
    import numpy as np
    green = np.uint8([[[0, 255, 0]]])
    hsv_green = cv.cvtColor(green, cv.COLOR_BGR2HSV)
    print(hsv_green)  # [[[ 60 255 255]]]

    image.gif

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

    9.5 练习题

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

    运行结果如下:

    image.gif编辑

    代码如下(先自己想想再看答案,再手动敲一遍,这样记忆更深刻!):

    import cv2 as cv
    import numpy as np
    cap = cv.VideoCapture('../video/9.mp4')
    while True:
        cv.waitKey(0)
        # 读取帧
        _, frame = cap.read()
        # 转换颜色空间BGR到HSV
        hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
        # 定义HSV中蓝色的范围
        lower_blue = np.array([100, 43, 46])
        upper_blue = np.array([124, 255, 255])
        # 设置HSV的阈值使得只取蓝色
        mask_blue = cv.inRange(hsv, lower_blue, upper_blue)
        # 定义HSV中绿色的范围
        lower_green = np.array([35, 43, 46])
        upper_green = np.array([77, 255, 255])
        # 设置HSV的阈值使得只取绿色
        mask_green = cv.inRange(hsv, lower_green, upper_green)
        # 定义HSV中红色1的范围
        lower_red1 = np.array([0, 43, 46])
        upper_red1 = np.array([10, 255, 255])
        # 设置HSV的阈值使得只取红色1
        mask_red1 = cv.inRange(hsv, lower_red1, upper_red1)
        # 定义HSV中红色2的范围
        lower_red2 = np.array([156, 43, 46])
        upper_red2 = np.array([180, 255, 255])
        # 设置HSV的阈值使得只取红色2
        mask_red2 = cv.inRange(hsv, lower_red2, upper_red2)
        # 将RGB三种颜色的掩膜相加
        mask = mask_blue + mask_green + mask_red1 + mask_red2
        # 将BGR掩膜和图像逐像素相加
        res = cv.bitwise_and(frame, frame, mask=mask)
        cv.imshow('frame', frame)
        cv.imshow('mask', mask)
        cv.imshow('result', res)
        if cv.waitKey(16) & 0xFF == 27:
            break
    cv.destroyAllWindows()

    image.gif


    欢迎评论区留言,一起探讨OpenCV成神之路的奥秘。

    顺便给我加个关注,点个赞,加个收藏,让我们一起登上神坛。

    image.gif编辑

    相关文章
    |
    机器学习/深度学习 编解码 计算机视觉
    OpenCV竟然可以这样学!成神之路终将不远(十六)
    OpenCV竟然可以这样学!成神之路终将不远(十六)
    |
    计算机视觉 Python
    OpenCV竟然可以这样学!成神之路终将不远(十)
    OpenCV竟然可以这样学!成神之路终将不远(十)
    |
    算法 计算机视觉 Python
    OpenCV竟然可以这样学!成神之路终将不远(二十六)
    OpenCV竟然可以这样学!成神之路终将不远(二十六)
    |
    算法 计算机视觉 索引
    OpenCV竟然可以这样学!成神之路终将不远(二十五)
    OpenCV竟然可以这样学!成神之路终将不远(二十五)
    |
    计算机视觉 Python
    OpenCV竟然可以这样学!成神之路终将不远(二十四)
    OpenCV竟然可以这样学!成神之路终将不远(二十四)
    |
    计算机视觉 Python
    OpenCV竟然可以这样学!成神之路终将不远(二十三)
    OpenCV竟然可以这样学!成神之路终将不远(二十三)
    |
    计算机视觉 索引 Python
    OpenCV竟然可以这样学!成神之路终将不远(二十二)
    OpenCV竟然可以这样学!成神之路终将不远(二十二)
    |
    安全 计算机视觉 索引
    OpenCV竟然可以这样学!成神之路终将不远(二十一)
    OpenCV竟然可以这样学!成神之路终将不远(二十一)
    |
    文字识别 计算机视觉 索引
    OpenCV竟然可以这样学!成神之路终将不远(二十)
    OpenCV竟然可以这样学!成神之路终将不远(二十)
    |
    定位技术 计算机视觉 Python
    OpenCV竟然可以这样学!成神之路终将不远(十九)
    OpenCV竟然可以这样学!成神之路终将不远(十九)
    下一篇
    无影云桌面