• OpenCV-Python入门教程4-颜色空间转换


    一、颜色空间转换

    import cv2
    import numpy as np
    img = cv2.imread('lena.jpg')
    # 转换成灰度图
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    cv2.imshow('img', img)
    cv2.imshow('gray', img_gray)
    cv2.waitKey(0)

    颜色转换其实是数学运算,如灰度化最常用的是:gray = R* 0.299 + G* 0.587 + B * 0.114

    二、视频中特定颜色物体追踪

    HSV:色调(H),饱和度(S),明度(V)。对光照的变换并不是很敏感,相比于BGR更易于区分颜色,常用于颜色识别的模型。转换模式用COLOR_BGR2HSV表示

    OpenCV中色调H的范围为[0, 179],饱和度S是[0, 255],明度V是[0, 255]。虽然H的理论数值是0°~360°,但8位图像像素点的最大值是255,所以OpenCV除以了2.

    现在,我们实现一个使用HSV来只显示视频中蓝色物体的例子,步骤如下:

      1. 捕获视频中一帧

      2. 从BGR转换到HSV

      3. 提取蓝色范围的物体

      4. 只显示蓝色物体

    # 蓝色的hsv值
    blue = np.uint8([[[255, 0, 0]]])
    hsv_blue = cv2.cvtColor(blue, cv2.COLOR_BGR2HSV)
    print(hsv_blue)
    [[[120 255 255]]]
    # 绿色的hsv值
    green = np.uint8([[[0, 255, 0]]])
    hsv_green = cv2.cvtColor(green, cv2.COLOR_BGR2HSV)
    print(hsv_green)
    [[[ 60 255 255]]]
    # 红色的hsv值
    red = np.uint8([[[0, 0, 255]]])
    hsv_red = cv2.cvtColor(red, cv2.COLOR_BGR2HSV)
    print(hsv_red)
    [[[  0 255 255]]]
    import numpy as np
    
    capture = cv2.VideoCapture(0)
    
    # 蓝色的范围,不同光照条件下不一样,可灵活调整
    lower_blue = np.array([100, 110, 110])
    upper_blue = np.array([130, 255, 255])
    
    while(True):
        # 1. 捕获视频中的一帧
        ret, frame = capture.read()
        
        # 2.从BGR转换到HSV
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        
        # 3. inRange(): 介于lower/upper之间的白色,其余黑色
        mask = cv2.inRange(hsv, lower_blue, upper_blue)
        
        # 4. 只保留原图中的蓝色部分
        res = cv2.bitwise_and(frame, frame, mask=mask)
        
        cv2.imshow('frame', frame)
        cv2.imshow('mask', mask)
        cv2.imshow('res', res)
        
        if cv2.waitKey(1) == ord('q'):
            break

    当然,你也可以只显示视频中红色或者绿色的物体。只要修改一下HSV值的上下限即可。

    三、在视频中同时提取红、绿、蓝色的物体

    capture = cv2.VideoCapture(0)
    
    # 蓝色的范围,不同光照条件下不一样,可灵活调整
    lower_blue = np.array([100, 110, 110])
    upper_blue = np.array([130, 255, 255])
    
    # 绿色的范围
    lower_green = np.array([40, 110, 110])
    upper_green = np.array([70, 255, 255])
    
    # 红色的范围
    lower_red = np.array([160, 110, 110])
    upper_red = np.array([179, 255, 255])
    
    while(True):
        # 1. 捕获视频中的一帧
        ret, frame = capture.read()
        
        # 2.从BGR转换到HSV
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        
        # 3. inRange(): 介于lower/upper之间的白色,其余黑色
        mask_blue = cv2.inRange(hsv, lower_blue, upper_blue)
        mask_green = cv2.inRange(hsv, lower_green, upper_green)
        mask_red = cv2.inRange(hsv, lower_red, upper_red)
        
        mask = mask_blue + mask_green + mask_red
        
        # 4. 只保留原图中的蓝色部分
        res = cv2.bitwise_and(frame, frame, mask=mask)
        
        cv2.imshow('frame', frame)
        cv2.imshow('mask', mask)
        cv2.imshow('res', res)
        
        if cv2.waitKey(1) == ord('q'):
            break

    四、小结

    • cv2.cvtColor()函数用来进行颜色空间转换,常用BGR↔RGB,BGR↔Gray,BGR↔HSV
    • HSV颜色模型常用于颜色识别,要想知道某种颜色在HSV下的值,可以将它的BGR值用cvtColor()转换得到

     参考网址:https://tianchi.aliyun.com/course/courseConsole?courseId=40992&chapterIndex=1&sectionIndex=5

  • 相关阅读:
    国外名校课程视频爆红 网友总结“必杀技”(图)
    设置mysql密码
    Writing Linux LCD drivers—深入分析framebuffer设备驱动的结构
    LAMP架构中,php 与 php、php与C语言程序等 之间 的网络通信 问题
    API & ABI
    Linux 6初体验:桌面性能堪比新版Ubuntu
    diff 比较两个文件夹
    11种错误的保养皮肤习惯
    服务器领域Linux击败Windows的5大理由
    CentOS5.5 FTP安装配置
  • 原文地址:https://www.cnblogs.com/gezhuangzhuang/p/10292096.html
Copyright © 2020-2023  润新知