如何使用 Python、OpenCV 和 InfluxDB 控制人群
作者:Ignacio Van Droogenbroeck / 产品,用例,开发者
2021 年 4 月 9 日
导航到
正如我之前提到的那样,我在学习 Python 开发;这似乎是一种非常容易解释的语言,迄今为止,我在使用它做事情时还没有找到“不”的答案。我很高兴,并且一直在学习。
在这个学习过程中,我开始用OpenCV(开源计算机视觉库)来检测人脸。OpenCV 是一个开源的、BSD 许可的库,包括数百个计算机视觉算法。我没有花费太多时间就理解了所有的工作原理,并开始思考 InfluxDB 时序用例以及如何集成其他技术。
从这次搜索中产生了将 OpenCV 与InfluxDB 集成的想法,以计算检测人脸的次数。我认为时序和生物识别技术是完美的匹配,这可以开辟许多应用,例如但不限于以下内容
- 记录在一天中的特定时刻通过商店特定入口点的人数
- 记录通过一条大道的汽车或其他车辆的数量。
- 计算有多少人停下来观看特定类型的产品,以了解它们是否对他们有吸引力
- 衡量零售和酒店业客户转换率,例如比较进入餐厅的客人数量和销售的盘子数量
- 在定义的空间和时间内监督人群(资源分配、交通灯管理、基础设施改进等)
最后一个在当前全球背景下非常重要。在疫情期间,确保公共安全,对于全球执法机构来说是一个挑战。
让我们看看一些代码...
该项目的代码可以在这个 GitHub 仓库中找到。相关的文件有
- live.py
- influxdb_config.ini
- haarcascade_frontalface_default.xml
文件 live.py 的内容如下所示。如果需要修改,唯一要修改的是桶的名字,使其与我们在InfluxDB中创建的桶匹配。
# This script will detect faces via your webcam and push the data to an InfluxDB instance.
# By Ignacio Van Droogenbroeck @hectorivand
import cv2
from datetime import datetime
from influxdb_client import Point, InfluxDBClient
from influxdb_client.client.write_api import SYNCHRONOUS
# Specify the InfluxDB bucket
bucket = "crowd-counter"
# In this file, you must set the parameters to connect to InfluxDB.
client = InfluxDBClient.from_config_file('influxdb_config.ini')
write_api = client.write_api(write_options=SYNCHRONOUS)
query_api = client.query_api()
cap = cv2.VideoCapture(0)
# Create the haar cascade
faceCascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
# Our operations on the frame come here
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Detect faces in the image
faces = faceCascade.detectMultiScale(
gray,
scaleFactor=1.2,
minNeighbors=5,
minSize=(30, 100)
)
# Write the quantity of faces detected on InfluxDB
p = Point("public-count").tag("cameras", "entry").field("people", '{0}'.format(len(faces)))
write_api.write(bucket=bucket, record=p)
# Draw a rectangle around the faces
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
# Display the resulting frame
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything is done, release the capture
cap.release()
cv2.destroyAllWindows()
需要修改的另一个文件是 influxdb_config.ini
。此文件包含连接到 InfluxDB 的数据。正如您所看到的,您需要定义连接到 InfluxDB 的值。
[influx2]
url=$INFLUX_URL
org=$INFLUX_ORG
token=$INFLUX_TOKEN
timeout=6000
verify_ssl=True
如果您没有运行 InfluxDB OSS 实例,我建议您创建一个InfluxDB Cloud账户(InfluxDB Cloud 是 InfluxDB 的一个托管、弹性、无服务器版本)。免费层级足以进行一些测试。如果您决定在生产环境中使用此解决方案,您可以保留您的云账户。
最后一个重要的文件是haarcascade_frontalface_default.xml。此文件提供了用于检测人脸的模型。在OpenCV: Cascade Classifier教程中,我建议阅读关于 haarcascade 以及为什么它是检测对象而无需训练 TensorFlow 模型的绝佳选择的介绍。
现在我们已经设置好了一切,让我们运行代码。
让我们来计算一些人脸...
一旦此脚本开始运行,如果您运行 live.py 脚本,它将激活您的摄像头开始计算人脸并将数据发送到 InfluxDB。
如您所见,这种人脸检测方法并不复杂。它可以用于控制高速公路或街道上的交通流量。
嗯,您可能正在想——一切都很好,您有一张漂亮的脸,车看起来也不错,但请用这种技术展示如何控制人群。当然!让我用这张截图回复您的评论。
在这种情况下,脚本检测到 110 张脸并将数据发送到 InfluxDB。想象一下,这个例子在公园、餐厅或集市上运行多个设备。
如您所注意到的,我使用了视频,因为,嗯,我家里没有人群!但输出将是相同的;在这种情况下,唯一的区别是数据的输入(视频与实时流)。
结论
这个软件解决方案并不完美;它是我的学习路径的一部分。如果您发现了一些问题,我鼓励您在GitHub 仓库中进行分叉并提出改进建议。
我希望这篇文章已经为您提供了部署 InfluxDB 的新用例。