如何使用 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 的托管、弹性、无服务器版本)。免费层足以进行一些测试。如果您已决定在生产环境中使用此解决方案,则可以保留您的 Cloud 帐户。
最后一个重要的文件是 haarcascade_frontalface_default.xml。此文件提供了检测人脸的模型。在 OpenCV:级联分类器 教程中,我建议阅读有关 haarcascade 的内容,以及为什么它是检测对象而无需训练 TensorFlow 模型的绝佳选择。
现在我们已经完成了所有设置,让我们运行代码。
让我们数数人脸...
一旦此脚本运行,如果您运行 live.py 脚本,它将激活您的网络摄像头以开始计数人脸并将该数据发送到 InfluxDB。
如您所见,这种人脸检测方法并不复杂。它可以用于控制高速公路或大街上的交通流量。
好吧,您可能会想——一切都很美好,您有一张漂亮的脸,汽车看起来也不错,但请告诉我如何使用这项技术控制人群。说得有道理!让我用这张截图回复您的评论。
在本例中,脚本检测到 110 张人脸并将该数据发送到 InfluxDB。想象一下,这个例子在公园、餐厅或集市中的多个设备上运行。
您可能会注意到,我使用了视频,因为,嗯,我家没有人群!但是输出将是相同的;在这种情况下,唯一的区别是数据的输入(视频与实时馈送)。
结论
这个软件解决方案并不完美;它是我学习之路的一部分。如果您发现任何问题,我鼓励您 fork 并提出 GitHub 存储库 中的改进建议。
我希望这篇文章为您提供了一个部署 InfluxDB 的全新用例。