📜  使用 OpenCV 和Python检测特定颜色(此处为蓝色)

📅  最后修改于: 2021-10-21 05:18:56             🧑  作者: Mango

Python的以下代码使用用于图像处理技术的OpenCV库。该程序允许检测实时流视频内容中的特定颜色。视频由不同时刻的无限帧组成。我们将一一检测每一帧的颜色。
代码只能在linux环境下编译。

在运行程序之前,请确保系统中安装了openCV
安装:

  • 在终端上运行以下命令以从 Ubuntu 或 Debian 存储库安装它。
sudo apt-get install libopencv-dev python-opencv
  • 或 为了从官方站点下载 OpenCV,请运行以下命令:
bash install-opencv.sh

在您的终端上。输入您的 sudo 密码,您将安装 OpenCV。由于要安装的软件包和编译过程,此操作可能需要很长时间。

  • 要安装 numpy 只需使用以下命令:
sudo pip install numpy
Python3
# Python program for Detection of a
# specific color(blue here) using OpenCV with Python
import cv2
import numpy as np
 
# Webcamera no 0 is used to capture the frames
cap = cv2.VideoCapture(0)
 
# This drives the program into an infinite loop.
while(1):       
    # Captures the live stream frame-by-frame
    _, frame = cap.read()
    # Converts images from BGR to HSV
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])
 
    # Here we are defining range of bluecolor in HSV
    # This creates a mask of blue coloured
    # objects found in the frame.
    mask = cv2.inRange(hsv, lower_blue, upper_blue)
 
    # The bitwise and of the frame and mask is done so
    # that only the blue coloured objects are highlighted
    # and stored in res
    res = cv2.bitwise_and(frame,frame, mask= mask)
    cv2.imshow('frame',frame)
    cv2.imshow('mask',mask)
    cv2.imshow('res',res)
 
    # This displays the frame, mask
    # and res which we created in 3 separate windows.
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break
 
# Destroys all of the HighGUI windows.
cv2.destroyAllWindows()
 
# release the captured frame
cap.release()


代码说明:

  • 摄像头设置:为了执行运行时操作,使用设备的网络摄像头。要捕获视频,我们需要创建一个 VideoCapture 对象。它的参数可以是设备索引或视频文件的名称。设备索引只是指定哪个相机的数字。通常会连接一个摄像头,因此我们只需传递 0。您可以通过传递 1 来选择第二个摄像头,依此类推。之后,您可以逐帧捕获。但最后,不要忘记释放捕获。此外,如果有人想在任何图像上应用这种颜色检测技术,只需稍加修改代码即可完成,我将在稍后讨论。
  • 捕获帧:使用无限循环,以便网络摄像头在每个实例中捕获帧,并在整个程序过程中打开。
    在逐帧捕获实时流后,我们将 BGR 色彩空间(默认)中的每一帧转换为 HSV 色彩空间。 OpenCV 中有超过 150 种颜色空间转换方法可用。但是我们将只研究使用最广泛的两种,BGR 到 Gray 和 BGR 到 HSV。对于颜色转换,我们使用函数cv2.cvtColor(input_image, flag) 其中 flag 确定转换类型。对于 BGR 到 HSV,我们使用标志 cv2.COLOR_BGR2HSV。现在我们知道如何将 BGR 图像转换为 HSV,我们可以使用它来提取彩色对象。在 HSV 中,表示颜色比 RGB 颜色空间更容易。
    在指定范围时,我们指定了蓝色的范围。而您可以输入您想要的任何颜色的范围。
  • 遮罩技术:遮罩基本上是按照一定的规则创建图像的某些特定区域。在这里,我们正在创建一个包含蓝色对象的蒙版。之后,我在输入图像和阈值图像上使用了 bitwise_and,以便仅突出显示蓝色对象并将其存储在 res 中。
    然后我们使用 imshow函数在 3 个单独的窗口上显示框架、分辨率和蒙版。
  • 显示帧:由于 imshow() 是 HighGui 的一个函数,因此需要定期调用 waitKey 以处理其事件循环。
    函数waitKey() 等待按键事件的“延迟”(此处为 5 毫秒)。如果不调用waitKey,HighGui 无法处理重绘、调整大小、输入事件等windows 事件。所以只需调用它,即使有1 毫秒的延迟。
  • 总结过程
    1. 拍摄视频的每一帧。
    2. 将每个帧从 BGR 转换为 HSV 颜色空间。
    3. 为一系列蓝色设置 HSV 图像的阈值。