zoukankan      html  css  js  c++  java
  • OpenCV4【6】-改变颜色空间

    opencv 中有几百种颜色空间,可通过如下方式获取;

    flags = [i for i in dir(cv) if i.startswith('COLOR')]
    print(len(flags))       # 296 种

    其中最常用的是 gray 和 hsv 空间;

    颜色空间转换

    opencv 直接读取图片是 RGB 空间,使用  cvtColor 转换到 其他空间

    def cvtColor(src, code, dst=None, dstCn=None)

    code 表示 转换方式

    示例

    ### BGR --> GRAY
    img = cv.imread('imgs/2.png')
    img_gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
    cv.imshow('img', img)
    cv.imshow('gray', img_gray)
    cv.waitKey(0)

    效果图

    ### BGR --> HSV
    img = cv.imread('imgs/2.png')
    img_hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
    cv.imshow('img', img)
    cv.imshow('hsv', img_hsv)
    cv.waitKey(0)

    效果图

    对象追踪 - 颜色空间的简单应用

    利用像素实现对象跟踪,这是最简单的跟踪方式;

    步骤:取视频的每一帧 - 从BGR转换到HSV颜色空间 - 对HSV图像设置蓝色范围的阈值 - 掩膜单独提取蓝色对象

    为什么是 HSV 而不是 BGR 或任何其他格式

    1. 在HSV中比在BGR颜色空间中 更容易表示颜色;

    2. HSV对外部照明的微小变化更敏感。它将提供更准确的掩膜,从而获得更好的结果。 

    代码

    cap = cv.VideoCapture(0)
    while(1):
        # 读取帧
        _, frame = cap.read()
        frame = cv.imread('imgs/30.png')        # 没有视频,拿一张图片做一帧
        # 转换颜色空间 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
    cv.destroyAllWindows()

    效果图

    如何获取 HSV像素值

    如何获取 RGB空间 追踪像素的 HSV空间 对应的像素值 呢?

    只需传递你想要的BGR值,而不是传递图像, 如

    green = np.uint8([[[0, 255, 0]]])
    hsv_green = cv.cvtColor(green, cv.COLOR_BGR2HSV)
    print(hsv_green)       # [[[ 60 255 255]]]
    
    blue = np.uint8([[[255, 0, 0]]])
    hsv_blue = cv.cvtColor(blue, cv.COLOR_BGR2HSV)
    print(hsv_blue)        # [[[120 255 255]]]

    然后把 [H-10, 100, 100] 和 [H+10, 255, 255] 分别作为下界和上界

    除了这个方法之外,你可以使用任何图像编辑工具(如GIMP或任何在线转换器)来查找这些值,但是不要忘记调整HSV范围

    参考资料:

    https://baike.baidu.com/item/HSV/547122?fr=aladdin  HSV颜色模型

    http://www.woshicver.com/FifthSection/4_1_%E6%94%B9%E5%8F%98%E9%A2%9C%E8%89%B2%E7%A9%BA%E9%97%B4/  中文官网

    https://mp.weixin.qq.com/s/YvAhBsIT3qSSVh1Ue4UFrg  开始使用 OpenCV 进行对象跟踪

  • 相关阅读:
    关于“jdk”版本不支持问题的总结
    Linux系统下jdk卸载安装、配置
    weblogic-jdk 问题
    MCU有哪些复位因素
    MCU固件升级(OTA)的几种Flash划分方式
    003_Linux常用命令之文件操作
    002_Linux常用命令之目录操作
    001_Linux常用命令之ls命令
    dup与dup2函数
    Linux 系统查询机器最近重启时间命令
  • 原文地址:https://www.cnblogs.com/yanshw/p/15386470.html
Copyright © 2011-2022 走看看