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

📅  最后修改于: 2023-12-03 15:06:49.372000             🧑  作者: Mango

使用 OpenCV 实时检测物体颜色

OpenCV 是一个开源计算机视觉库,它包含了很多用于图像处理、计算机视觉和机器学习的函数和工具。

在本教程中,我们将使用 OpenCV 和 Python 实现实时检测物体颜色的功能。我们将通过摄像头获取图像,并将其转换为 HSV(色相、饱和度、亮度)颜色空间。然后,我们将检测指定颜色的物体并在屏幕上绘制一个矩形框来标识物体位置。

环境准备

在开始之前,您需要安装并配置好以下环境:

  • Python 3.x
  • OpenCV 库

您可以使用 pip 安装 OpenCV 库:

pip install opencv-python
图像捕获与显示

第一步是打开摄像头并捕获实时视频流。我们将使用 OpenCV 的 VideoCapture 类来捕获视频。

import cv2

cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    
    cv2.imshow('frame', frame)
    
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

在代码中,我们首先使用 cv2.VideoCapture(0) 打开默认摄像头。然后在 while 循环中,我们读取当前帧并使用 cv2.imshow 将其显示在屏幕上。最后,我们检查是否按下了“q”键,如果是,则退出循环。

请注意,在退出程序之前,我们需要释放所有分配的资源。

转换为 HSV 颜色空间

要检测物体的颜色,我们需要将图像转换为 HSV(色相、饱和度、亮度)颜色空间。HSV 颜色空间可以更好地表示颜色信息,因为它可以将颜色的亮度和饱和度分开。

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    
    cv2.imshow('frame', hsv)
    
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

在代码中,我们使用 cv2.cvtColor 将彩色图像转换为 HSV 颜色空间。然后,我们将转换后的图像显示在屏幕上。

检测指定颜色的物体

现在,我们已经将图像转换为 HSV 颜色空间,我们可以使用 cv2.inRange 函数检测指定颜色的物体。

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    
    lower_color = np.array([110, 50, 50])
    upper_color = np.array([130, 255, 255])
    
    mask = cv2.inRange(hsv, lower_color, upper_color)
    res = cv2.bitwise_and(frame, frame, mask=mask)
    
    cv2.imshow('frame', frame)
    cv2.imshow('mask', mask)
    cv2.imshow('res', res)
    
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

在代码中,我们首先定义了一个颜色范围。使用 cv2.inRange 函数,我们可以把住指定颜色范围内的物体。然后使用 cv2.bitwise_and 函数将 maskframe 相位加,得到我们想要的结果。

绘制矩形框标识物体位置

现在,我们已经可以检测特定颜色的物体,下一步是通过绘制矩形框来便于识别物体的位置。

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    
    lower_color = np.array([110, 50, 50])
    upper_color = np.array([130, 255, 255])
    
    mask = cv2.inRange(hsv, lower_color, upper_color)
   
    contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    
    for cnt in contours:
        area = cv2.contourArea(cnt)
        if area > 500:
            x, y, w, h = cv2.boundingRect(cnt)
            cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
    
    cv2.imshow('frame', frame)
    cv2.imshow('mask', mask)
    
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

在代码中,我们首先使用 cv2.findContours 函数查找 mask 中的轮廓。然后循环所有轮廓,计算面积并筛选掉小于 500 的区域。

最后,我们使用 cv2.rectangle 函数绘制一个矩形框,覆盖物体区域。这样我们就可以精确地检测物体的位置。

到此为止,我们已经成功地实现了使用 OpenCV 实时检测物体颜色的功能!

请注意,这仅是一个基本示例。实际上,您需要对颜色范围和面积进行更严格的控制,以便得到更准确的结果。此外,您还可以使用深度学习技术和更复杂的算法来更好地检测物体。