📌  相关文章
📜  使用 Python-OpenCV 实时检测多种颜色(1)

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

使用 Python-OpenCV 实时检测多种颜色

简介

本文介绍如何使用 Python 和 OpenCV 库在实时视频流中检测多种颜色。通过这个小项目,我们可以学习如何使用 OpenCV 中的颜色空间、二值化、轮廓检测等功能。

技术准备

为了完成这个项目,我们需要以下技术准备:

  • Python 3
  • OpenCV 库
  • Numpy 库

如果你还没有安装 OpenCV 和 Numpy 库,可以通过以下命令进行安装:

pip install opencv-python numpy
检测多种颜色

对于颜色检测的应用场景,往往需要检测多种颜色。本文将演示如何检测三种常见的颜色:红色、绿色和蓝色。你也可以根据自己的需要增加或者减少需要检测的颜色种类。

我们可以用颜色在颜色空间中的分布特点来帮助进行颜色检测。在 RGB 颜色空间中,红色的 B 和 G 分量都很小,而 R 分量很大;绿色的 R 和 B 分量都很小,而 G 分量很大;蓝色的 R 和 G 分量都很小,而 B 分量很大。因此,从 RGB 颜色空间中分离出红、绿、蓝三种颜色是很困难的。

在 HSV 颜色空间中,H 表示色调,S 表示饱和度,V 表示亮度。HSV 颜色空间更能反映出颜色的特点。以红色为例,HSV 颜色空间中,红色的 H 值在 0-10 和 165-180 之间,S 和 V 都比较大。同理,绿色的 H 值在 35-77 之间,S 和 V 都比较大;蓝色的 H 值在 100-124 之间,S 和 V 都比较大。因此,在 HSV 颜色空间中分离出红、绿、蓝三种颜色就相对容易了。

下面是代码片段:

import cv2
import numpy as np

def detect_color(hsv, color):
    lower = np.array(color[0])
    upper = np.array(color[1])
    mask = cv2.inRange(hsv, lower, upper)
    res = cv2.bitwise_and(frame, frame, mask=mask)
    return res

red = ([0, 100, 100], [10, 255, 255])
green = ([35, 100, 100], [77, 255, 255])
blue = ([100, 100, 100], [124, 255, 255])

cap = cv2.VideoCapture(0)

while True:
    _, frame = cap.read()
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    red_mask = detect_color(hsv, red)
    green_mask = detect_color(hsv, green)
    blue_mask = detect_color(hsv, blue)
    
    cv2.imshow('frame', frame)
    cv2.imshow('red', red_mask)
    cv2.imshow('green', green_mask)
    cv2.imshow('blue', blue_mask)
    
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
总结

在本文中,我们学习了如何使用 Python 和 OpenCV 库在实时视频流中检测多种颜色。通过这个小项目,我们可以学习到如何使用 OpenCV 中的颜色空间、二值化、轮廓检测等功能。这个小项目只是一个起点,您可以根据自己的需求进行扩展,实现更多的功能。