• opencv-python教程学习系列10-颜色空间转换


    前言

    opencv-python教程学习系列记录学习python-opencv过程的点滴,本文主要介绍颜色空间转换,坚持学习,共同进步。

    系列教程参照OpenCV-Python中文教程

    系统环境

    系统:win7_x64;

    python版本:python3.5.2;

    opencv版本:opencv3.3.1;

    内容安排

    1.知识点介绍;

    2.测试代码;

    具体内容

    1.知识点介绍;

    使用的库有cv2/numpy,涉及函数有cv2.cvtColor(),cv2.inRange();

    1.1 转换颜色空间;

    1)opencv有很多种颜色空间转换方法,常用的一般是BGR转灰度/HSV;

    函数表示为cv2.cvtColor(input_image, flag),其中flag就是转换类型,比如cv2.COLOR_BGR2GRAY、cv2.COLOR_BGR2HSV等。

    2)在OpenCV的HSV格式中,H(色彩/色度)的取值范围是 [0,179],S(饱和度)的取值范围 [0,255],V(亮度)的取值范围 [0,255]。

    但是不同的软件使用的值可能不同,所以当拿OpenCV的HSV值与其他软件的HSV值对比时,一定要记得归一化

    hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
    

    3)如何查看flag表示的格式转换类型;

    #查看所有格式转换
    import cv2 
    flags = [i for i in dir(cv2) if i.startswith("COLOR_") ]
    print (len(flags))#list的长度;
    print (flags)
    

    1.2 物体跟踪;

    可以利用格式转换提取物体的颜色信息,HSV要比BGR更好地表示某种特定颜色;

    提取某种颜色的步骤:step1,从视频中获取图像帧;step2,将图像转换到HSV空间;

    step3,设置HSV中某种颜色的范围;step4,获取图像中的某种颜色,从而进行其他处理;

    #设定蓝色的阀值
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])
    #根据阀值构建掩模
    mask = cv2.inRange(hsv,lower_blue,upper_blue)
    #对原图和掩模进行位运算
    res = cv2.bitwise_and(frame,frame,mask=mask)
    

    1.3 如何找到物体的HSV值;

    2.测试代码;

    2.1 物体跟踪;

    import cv2
    import numpy as np
    
    cap = cv2.VideoCapture(0)
    
    while(1):
        #获取每一帧
        ret,frame = cap.read()
        #转换到HSV
        hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
        #设定蓝色的阀值
        lower_blue = np.array([110,50,50])
        upper_blue = np.array([130,255,255])
        #根据阀值构建掩模
        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
    #关闭窗口
    cv2.destroyAllWindows()
    

    2.2 如何找到物体的HSV值;

    #查看所有格式转换
    import cv2 
    flags = [i for i in dir(cv2) if i.startswith("COLOR_") ]
    print (len(flags))#list的长度;
    #print (flags)
    
    #
    import numpy as np
    #green=np.uint8([0,255,0])
    #hsv_green=cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
    #out:
    #error: /builddir/build/BUILD/opencv-2.4.6.1/ modules/imgproc/src/color.cpp:3541: 
    #error: (-215) (scn == 3 || scn == 4) && (depth == CV_8U || depth == CV_32F) in function cvtColor
    
    #scn (the number of channels of the source),
    #i.e. self.img.channels(), is neither 3 nor 4. 
    # #depth (of the source), 
    #i.e. self.img.depth(), is neither CV_8U nor CV_32F.
    # 所以不能用 [0,255,0] 而用 [[[0,255,0]]] 
    # 的三层括号应分别对应于 cvArray cvMat IplImage
    #以上内容没明白???
    green=np.uint8([[[0,255,0]]])
    hsv_green=cv2.cvtColor(green,cv2.COLOR_BGR2HSV) 
    print (hsv_green )
    #out: [[[60 255 255]]]
    

    参考

    1.颜色空间转换

    2.list长度

  • 相关阅读:
    进击的实时数仓:Flink 在 OPPO 实时计算平台的研发与应用实践
    vue中将时间戳转换为YYYY-MM-dd hh:mm格式时间的组件
    vue 将时间戳转换成日期格式 (一)
    element-ui DatePicker 日期选择器 让结束日期大于开始日期
    css 边框上如何写入文字?
    2019最新Web前端经典面试试题(含答案)
    Nginx 安装及配置
    前端基础面试题(JS部分)
    const与指针
    linux配置-------redhat虚拟机的中文输入法配置
  • 原文地址:https://www.cnblogs.com/happyamyhope/p/8127413.html
Copyright © 2020-2023  润新知