zoukankan      html  css  js  c++  java
  • opencv 实现颜色空间转换 特定颜色物体追踪

    颜色空间转换

    HSV简介

    HSV是一个常用于颜色识别的模型,相比BGR更易区分颜色。H表示色调(Hue),S表示饱和度(Saturation),V表示明度(Value)。
    OpenCV中色调H范围为[0,179],饱和度S是[0,255],明度V是[0,255]。虽然H的理论数值是0°~360°,但8位图像像素点的最大值是255,所以OpenCV中除以了2,某些软件可能使用不同的尺度表示,所以同其他软件混用时,记得归一化。

    opencv中颜色空间转换

    cv.cvtColor()用来进行颜色模型转换,参数1是要转换的图片,参数2是转换模式。
    BGR -> Gray
    cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    BGR -> HSV
    cv.cvtColor(img, cv.COLOR_BGR2HSV)
    其它情况请举一反三

    颜色转换本质

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

    视频中特定颜色物体追踪

    HSV是一个常用于颜色识别的模型,相比BGR更易区分颜色,转换模式用COLOR_BGR2HSV表示。

    算法流程

    1. 捕获视频中的一帧
    2. 从BGR转换到HSV
    3. 提取蓝色范围的物体
    4. 只显示蓝色物体

    代码实现

    import cv2 as cv 
    import numpy as np 
    
    capture = cv.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 = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
    
        # 3.inRange():介于lower/upper之间的为白色,其余黑色
        mask = cv.inRange(hsv, lower_blue, upper_blue)
    
        # 4.只保留原图中的蓝色部分
        res = cv.bitwise_and(frame, frame, mask=mask)
    
        cv.imshow('frame', frame)
        cv.imshow('mask', mask)
        cv.imshow('res', res)
    
        if cv.waitKey(1) == ord('q'):
            break
    

    实验结果(res)

    成功捕获了蓝色图像

    如何得到蓝色的HSV的上下限lower和upper范围

    blue = np.uint8([[[255, 0, 0]]])
    hsv_blue = cv2.cvtColor(blue, cv2.COLOR_BGR2HSV)
    print(hsv_blue)  # [[[120 255 255]]]
    
  • 相关阅读:
    flask为blueprint增加error_handler
    solr的moreLikeThis实现“相似数据”功能
    pgsql删除重复记录
    sqlalchemy的不区分大小写比较
    logrotate运行时间指定
    远程桌面剪贴板失效的解决方法
    github上关于campbell数据采集的一些代码。
    python 学习笔记
    guestfs-python 手册
    [KVM][guestfs] 安装 guestfs-python 出错
  • 原文地址:https://www.cnblogs.com/wojianxin/p/12589115.html
Copyright © 2011-2022 走看看