【OpenCv-Python】九、Changing Colorspaces颜色空间转换

版权声明:本文为博主原创文章,未经博主允许不得转载。| www.qingning99.cn | 公众号:Worldhello | https://blog.csdn.net/vcx08/article/details/79096673

颜色空间转换

目标

  • 在本教程中,您将学习如何将图像从一个颜色空间转换为另一个颜色空间,如BGR——>Gray,BGR——>HSV 等。
  • 除此之外,我们还将创建一个应用程序,在视频中提取一个有色对象。
  • 你将要学习这些函数:cv2.cvtColor(),cv2.inRange()等

9.1 转换颜色空间

在OpenCV中有150多种颜色空间转换方法。但是我们将只研究其中最广泛使用的两种,BGR 与 Gray,BGR 与 HSV。
对于颜色转换,我们经常使用函数cv2.cvtColor(input_image, flag),其中 flag 决定转换的类型。
对于BGR 与 Gray 转换,我们使用flag 是 cv2.COLOR_BGR2GRAY。类似地,对于BGR 与 HSV,我们使用了flag 是 cv2.COLOR_BGR2HSV。要获取其他flag,只需在Python终端中运行以下命令:

import cv2
flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
print(flags)

注意

在 OpenCV 的 HSV 格式中 H(色彩/色度)的取值范围是 [0,179] S(饱和度)的取值范围 [0,255] V(亮度)的取值范围 [0,255]。但是不同的软件使用的值可能不同。所以当你需要拿 OpenCV 的 HSV 值与其他软件的 HSV 值对比时,一定记得归一化。

9.2 物体跟踪

现在我们知道了如何将BGR图像转换为HSV,我们可以用它来提取一个颜色对象。在HSV中,表示颜色比RGB颜色空间更容易。在我们的应用程序中,我们将尝试提取一个蓝色的对象。下面这就是方法:

  • 提取每一帧的视频
  • 将图像转换到HSV空间
  • 设置HSV图像阈值到蓝色范围
  • 现在提取蓝色物体,我们可以在图像上做任何我们想做的事情。

下面是有详细注释的代码:

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while(1):

    # 提取每一帧的视频
    _, frame = cap.read()

    # 将BGR转换为 HSV
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    # 定义HSV中蓝色的范围
    #黑色lower_black = np.array([0,0,0]) upper_black = np.array([180,255,46])
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])

    # 根据阈值HSV 构建掩模
    mask = cv2.inRange(hsv, lower_blue, upper_blue)

    # 对原图像和掩模进行位运算
    res = cv2.bitwise_and(frame,frame, mask= mask)

    cv2.imshow('frame',frame)
    cv2.imshow('mask',mask)
    cv2.imshow('res',res)
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break
cap.release()
cv2.destroyAllWindows()

注意:

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

这是对象跟踪中最简单的方法。一旦你学习了等高线的功能,你可以做很多事情,比如找到这个物体的质心,然后用它来跟踪物体,画出图,你的手在镜头前移动,还有很多其他有趣的东西。

9.3 如何找到要跟踪对象的HSV值?

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

green = np.uint8([[[0,255,0 ]]])
hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
print(hsv_green)
阅读更多 登录后自动展开

扫码向博主提问

壹言

非学,无以致疑;非问,无以广识
去开通我的Chat快问
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页