📌  相关文章
📜  使用 OpenCV 实时检测物体颜色

📅  最后修改于: 2022-05-13 01:55:33.488000             🧑  作者: Mango

使用 OpenCV 实时检测物体颜色

在本文中,我们将讨论如何使用Python和 OpenCV 检测单色颜色对象。单色是指单一波长的光。我们将使用使用网络摄像头捕获的视频作为输入,并尝试检测单一颜色的物体,尤其是蓝色。但是如果您正确设置范围,您可以检测任何颜色,我们将在稍后讨论。

为此,强烈建议将颜色从 RGB 格式转换为 HSV。 HSV 代表色调、饱和度和值。色调表示颜色本身,从技术上讲,它表示 HSV 颜色模型中的角度。

我们先来了解一下HSV颜色模型。想象一个圆柱体,它有一个高度、一个半径和一个曲面区域。以半径的初始位置为参考,将半径逆时针移动一个角度θ,即θ为半径的当前位置与其初始位置的夹角。如果 θ 为 0 度,则表示红色,如果 θ 为 120 度,则表示绿色,依此类推。半径的长度是颜色的饱和度,高度表示HSV中的值或V。



主要思想是将输入的 RGB 图像(在 OpenCV 的情况下为 BGR,因为这是在此模块中格式化图像的方式)转换为 HSV 格式,这将使我们更容易将特定颜色从帧中屏蔽掉。也就是说,所提供的 HSV 范围内的任何颜色都将被赋予 255 的值,而其他的将仅为 0,因此,具有指定范围内颜色的每个对象都将变为白色,而图像的其余部分即背景为黑色.

要显示颜色,我们需要按位和带有遮罩的当前帧。为此,有一个名为 bitwise_and() 的内置函数

syntax: 
result = cv2.bitwise_and(pic1, pic2, mask)

其中 pic1 和 pic 2 是输入图像,另一个是掩码。可以将蒙版视为应用于图像的剪切形状,以便只有剪切部分可见。

执行:

首先,使用以下两个代码在导入所需模块后创建一个 OpenCV 视频捕获对象:

import cv2
import numpy as np

然后开始无限循环,读取网络摄像头读取的每一帧。使用cv2.cvtColor()函数将每一帧从 BGR 格式转换为 HSV 格式,它将帧作为第一个输入,将颜色转换类型作为第二个输入。

syntax:
cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

之后指定蓝色(或您喜欢的任何颜色)的下限和上限。通过创建两个 NumPy 数组,其所需的下限和上限为 [H, S, V]。这两个 NumPy 数组将用作阈值函数(即cv2.inRange()函数)中的参数。这需要三个参数,图像源、下限和上限。

syntax:
cv2.inRange(source, lower_limit, upper_limit)

cv2.inRange()函数将范围内的所有值设置为 255,其余设置为 0。此函数的输出将是我们的掩码。最后在前面提到的bitwise_and函数中传递这个掩码将产生所需的结果。输出如下。

代码:

Python3
import cv2
import numpy as np
  
cap = cv2.VideoCapture(0)
  
while 1:
    ret,frame =cap.read() 
    # ret will return a true value if the frame exists otherwise False
    into_hsv =cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
    # changing the color format from BGr to HSV 
    # This will be used to create the mask
    L_limit=np.array([98,50,50]) # setting the blue lower limit
    U_limit=np.array([139,255,255]) # setting the blue upper limit
         
  
    b_mask=cv2.inRange(into_hsv,L_limit,U_limit)
    # creating the mask using inRange() function
    # this will produce an image where the color of the objects
    # falling in the range will turn white and rest will be black
    blue=cv2.bitwise_and(frame,frame,mask=b_mask)
    # this will give the color to mask.
    cv2.imshow('Original',frame) # to display the original frame
    cv2.imshow('Blue Detector',blue) # to display the blue object output
  
    if cv2.waitKey(1)==27:
        break
    # this fucntion will be triggered when the ESC key is pressed
    # and the while loop will terminate and so will the program
cap.release()
  
cv2.destroyAllWindows()


输出: