zoukankan      html  css  js  c++  java
  • 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长度

  • 相关阅读:
    shell脚本day06-sed
    shell脚本day05-交互式输入与for语句
    shell脚本day04-if语句
    shell脚本day04-grep与正则表达式
    shell脚本day03-编程原理
    shell脚本day02-重定向与管道符
    编程原理大致介绍
    进程管理
    Linux网络
    shell脚本--grep以及正则表达式
  • 原文地址:https://www.cnblogs.com/happyamyhope/p/8127413.html
Copyright © 2011-2022 走看看