美文网首页OpenCV
OpenCV-Python教程:10.更改颜色空间

OpenCV-Python教程:10.更改颜色空间

作者: xxxss | 来源:发表于2017-06-15 14:13 被阅读279次

目标:

·如何把图片从一个彩色空间转换到别的,比如BGR<->Gray, BGR<->HSV。

·在此之上,我们会创建一个应用把一个彩色的物体从视频里拿出来

·了解下列函数:cv2.cvtColor(), cv2.inRange()

变更色彩空间

在OpenCV里有超过150中色彩空间转换方法。但是我们只看看其中两种应用最广泛的,BGR<->Gray和BGR<->HSV。

对于色彩转换,我们使用函数cv2.cvtColor(input_image, flag),这里flag决定转换的类型。

对于BGR<->Gray转换我们使用标志位 cv2.COLOR_BGR2GRAY。而对BGR<->HSV来说类似,我们使用cv2.COLOR_BGR2HSV。要获得其他标志,在Python终端里执行下面的指令:

>>>import cv2
>>>flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
>>>print flags

注意:
对于HSV, 色彩空间是[0, 179],饱和度空间是[0, 255]而值空间是[0, 255]。不同软件使用不同的标量。所以如果你要比较OpenCV的值你需要统一这些值域。

物体跟踪

现在我们知道如何去把BGR图片转换成HSV,我们可以用这个来分解出彩色物体。在HSV里,要表现一个颜色要比RGB空间要简单。在我们的应用里,我们会尝试分解出一个蓝色物体,这里是方法:

·从视频里取出每一帧

·把BGR转换到HSV

·我们在HSV图片里设置一个色彩阈值来过滤蓝色

·现在我们只把蓝色物体分解出来,我们可以对那个图片按自己的需要处理。

下面是代码:

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while(1):

    # Take each frame
    _,frame = cap.read()

    # Convert BGR to HSV
    hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)

    # define range of blue color in HSV
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])

    # Threshold the HSV image to get only blue colors
    mask = cv2.inRange(hsv,lower_blue,upper_blue)

    # Bitwise-AND mask and original image
    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()

注意:


在图片里会有一些噪音。

注意:
这是最简单的物体跟踪的办法。当你学了其他轮廓线方法,你可以做很多事情了,比如找到这个物体的重心,用它来跟踪物体,在摄像头前只移动手就能画出图来,等等他有意思的事情。

如何找到要跟踪的HSV值

这是stackoverflow.com上最常见的问题。其实十分简单,你可以使用这个函数: cv2.cvtColor()。你可以传一个BGR值而不用传一个图片,比如,要找到绿色的HSV值,用下面的命令:

>>>green = np.uint8([[[0,255,0]]])
>>>hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
>>>print hsv_green
[[[ 60 255 255]]]

现在你拿到了[h-10, 100, 100]和[H+10, 255,255]作为下限和上限。除了这个方法以外,你可以使用任何图片编辑工具,比如GIMP或者其他在线转换器来找到这些值,但是不要忘了调整HSV值域。

相关文章

网友评论

  • 2de301f53577:博主,请问怎么识别出某种颜色并且过滤掉这种颜色?
    2de301f53577:@xxxss 嗯嗯,明白了
    xxxss:这篇里面写的就是你说的这个需求啊,通过过滤器过滤指定颜色。。比如例子里就是过滤掉蓝色。
    您所说的“识别”是个什么概念?是机器或者你本来不知道要过滤哪种颜色?如果你知道是要过滤什么颜色,那就按这个方法过滤就好了啊

本文标题:OpenCV-Python教程:10.更改颜色空间

本文链接:https://www.haomeiwen.com/subject/pggfjttx.html