OpenCV颜色检测和过滤是启动OpenCV Python开发的绝佳场所。在本文中,我将介绍一个基本的Python程序,以便开始使用OpenCV。该程序将允许用户尝试颜色过滤和检测例程。本文标志着我开始创建对象检测机器人的开始。
OpenCV(开源计算机视觉库)用于过滤从视频流,视频文件或图像文件中获取的图像。使用支持的编程语言时,您可以创建程序以使用相机作为传感器来检测和跟踪图像中的元素。如果可以隔离图像中的元素,则可以检测和跟踪视频流中的元素。
塑料球红色,蓝色,黄色和绿色
2018年Pi Wars 4.0
我已经对OpenCV感兴趣了几年了,但直到现在我还没有很好地利用它。我最近与OpenCV合作的动机是最近的Pi Wars 比赛。比赛中的挑战之一叫做“彩虹之上的某个地方”。这一挑战要求竞争机器人检测四种不同颜色(红色,蓝色,黄色和绿色)的四个球。机器人必须以特定的颜色顺序驾驶每个球,以完成对可用最佳点的挑战。
因此,为了能够在“彩虹上的某个地方”挑战中做出一些努力,我将看到如何检测四种不同的颜色。因此,OpenCV颜色检测是识别感兴趣的四种颜色的良好起点 - 红色,蓝色,黄色和绿色。
OpenCV颜色检测只是一个起点。最终目标是最终使用Python 3代码在视频流帧中定位彩色元素位置。因此,如果我可以隔离和跟踪视频流中的元素,我可以为机器人设置一个航点,例如。
安装OpenCV
要运行OpenCV颜色检测示例Python程序,您必须在Raspberry Pi或Windows OS上安装OpenCV。
覆盆子皮
要快速将OpenCV安装到Raspberry Pi,您可以按照本文从shell脚本文件安装OpenCV。您可以下载并启动shell脚本,以便一次性安装OpenCV和所有依赖项。
从Shell脚本 - 链接安装OpenCV到Raspberry Pi 。
Windows 10
如果您有兴趣在Windows 10上运行OpenCV,则需要安装Python。然后,使用Python pip包管理器安装Numpy和OpenCV库。我相信Python包含带有Windows Python安装的pip包管理器。
pip3 install numpy
pip3 install opencv-python
现在,Idle应用程序可用于在Windows中运行和编辑Python代码。
我的GitHub提供了两个版本的OpenCV颜色检测Python 3代码示例。它们之间的唯一区别是它们打开的媒体类型。因此,一个Python代码示例打开一个图像文件,而另一个打开视频流。但是,如果你在一个虚拟机环境中运行Linux或树莓派,像一个精选本后,您可能只能够打开的图像或视频文件。
覆盆子Pi相机
为了我的目的和示例代码兼容性,我使用Banggood的廉价USB Raspberry Pi兼容网络摄像头(产品编号:1023048)。耗费5.10英镑(6.67美元)的网络摄像头,与Raspberry Pi相机相比,使用更长的电缆更加强大。
但是,如果您想将Raspberry Pi相机与下面的代码示例一起使用,请查看以下资源以获取指南的链接。该指南将解释如何在OpenCV中使用Raspberry Pi相机。
示例Python程序如何工作
在Raspberry Pi或Windows桌面上使用Python Idle应用程序运行下面的代码。窗口应该出现在桌面上,如上图所示。您可以操作HSV(色相,饱和度,值)滑块以隔离要在图像中检测的颜色。
使用GUI滑块定义新颜色时,首先重置滑块。因此前三个滑块变为零; 底部三个转到255.应首先更改低和高Hue值以锁定所需的颜色。然后调整低饱和度和值以进行微调。
选择的低和高之间的HSV值范围将用于在要检测的颜色配置文件周围创建掩模。尝试不同的图像,以更好地了解隔离各种颜色的挑战。
请在下面的参考资料中查看GitHub链接到此代码的两个版本和测试图像。
OpenCV颜色检测代码
#!/usr/bin/env python3
"""
File: opencv-open-file-color-test.py
This Python 3 code is published in relation to the article below:
https://www.bluetin.io/opencv/opencv-color-detection-filtering-python/
Website: www.bluetin.io
Author: Mark Heywood
Date: 8/12/2017
Version 0.1.0
License: MIT
"""
from __future__ import division
import cv2
import numpy as np
def nothing(*arg):
pass
# Initial HSV GUI slider values to load on program start.
icol = (36, 202, 59, 71, 255, 255) # Green
#icol = (18, 0, 196, 36, 255, 255) # Yellow
#icol = (89, 0, 0, 125, 255, 255) # Blue
#icol = (0, 100, 80, 10, 255, 255) # Red
cv2.namedWindow('colorTest')
# Lower range colour sliders.
cv2.createTrackbar('lowHue', 'colorTest', icol[0], 255, nothing)
cv2.createTrackbar('lowSat', 'colorTest', icol[1], 255, nothing)
cv2.createTrackbar('lowVal', 'colorTest', icol[2], 255, nothing)
# Higher range colour sliders.
cv2.createTrackbar('highHue', 'colorTest', icol[3], 255, nothing)
cv2.createTrackbar('highSat', 'colorTest', icol[4], 255, nothing)
cv2.createTrackbar('highVal', 'colorTest', icol[5], 255, nothing)
# Raspberry pi file path example.
#frame = cv2.imread('/home/pi/python3/opencv/color-test/colour-circles-test.jpg')
# Windows file path example.
frame = cv2.imread('colour-circles-test.jpg')
while True:
# Get HSV values from the GUI sliders.
lowHue = cv2.getTrackbarPos('lowHue', 'colorTest')
lowSat = cv2.getTrackbarPos('lowSat', 'colorTest')
lowVal = cv2.getTrackbarPos('lowVal', 'colorTest')
highHue = cv2.getTrackbarPos('highHue', 'colorTest')
highSat = cv2.getTrackbarPos('highSat', 'colorTest')
highVal = cv2.getTrackbarPos('highVal', 'colorTest')
# Show the original image.
cv2.imshow('frame', frame)
# Blur methods available, comment or uncomment to try different blur methods.
frameBGR = cv2.GaussianBlur(frame, (7, 7), 0)
#frameBGR = cv2.medianBlur(frameBGR, 7)
#frameBGR = cv2.bilateralFilter(frameBGR, 15 ,75, 75)
"""kernal = np.ones((15, 15), np.float32)/255
frameBGR = cv2.filter2D(frameBGR, -1, kernal)"""
# Show blurred image.
cv2.imshow('blurred', frameBGR)
# HSV (Hue, Saturation, Value).
# Convert the frame to HSV colour model.
hsv = cv2.cvtColor(frameBGR, cv2.COLOR_BGR2HSV)
# HSV values to define a colour range.
colorLow = np.array([lowHue,lowSat,lowVal])
colorHigh = np.array([highHue,highSat,highVal])
mask = cv2.inRange(hsv, colorLow, colorHigh)
# Show the first mask
cv2.imshow('mask-plain', mask)
kernal = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7))
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernal)
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernal)
# Show morphological transformation mask
cv2.imshow('mask', mask)
# Put mask over top of the original image.
result = cv2.bitwise_and(frame, frame, mask = mask)
# Show final output image
cv2.imshow('colorTest', result)
k = cv2.waitKey(5) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
OpenCV有很好的文档记录,只是谷歌一个你不熟悉的OpenCV方法,可以找到更多关于它的信息。
OpenCV颜色检测代码执行以下步骤:
实验
使用上面的代码来试验不同的样本图像。尝试隔离样本图像中的各种元素。此外,尝试不同的模糊方法,并尝试调整模糊值,看看这有什么不同。关于平滑图像的OpenCV文章可以在 这里。
frameBGR = cv2.GaussianBlur(frame, (15, 15), 0)
frameBGR = cv2.medianBlur(frame, 7)
frameBGR = cv2.bilateralFilter(frame, 15 ,75, 75)
kernal = np.ones((15, 15), np.float32)/255
frameBGR = cv2.filter2D(frame, -1, kernal)
形态转换
示例代码中使用的形态变换操作有助于填充我试图过滤的圆形彩球中的孔。单独使用颜色过滤时,暗阴影和灯泡点会导致图像蒙版不完美。要了解更多关于形态转换,请访问OpenCV的文档在这里。
kernal = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (30, 30))
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernal)
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernal)
椭圆大小取决于您要关闭或打开的斑点的大小。
如果您有兼容的网络摄像头,请尝试使用Python代码的视频捕获版本。在下面的参考资料下找到代码的链接。
示例代码可能是您想要开始的最小值。然而,检测比圆球更复杂的物体可能需要更复杂的编码解决方案。
使用本文中介绍的OpenCV示例代码,代码无法跟踪图像中的AOI(感兴趣区域)。所以这就是我将在下一篇OpenCV文章中讨论的内容。
使用OpenCV和Python进行对象检测和跟踪 - 链接。
使用OpenCV和Python多线程的Pi Camera视频捕获 - 链接。
例如,我们能够在视频流中跟踪AOI,我们可以使用该信息为机器人设置一个旅行点。例如,航点可以是机器人停靠的充电站。如果您对AOI可能有什么其他想法,请使用评论部分。
资源
我希望你发现这篇文章很有用 - OpenCV Color Detection and Filtering with Python,请喜欢和分享。