基于树莓派与OpenCV的人群计数装置设计与实现
数字图像处理在今天的科技圈里,发展速度越来越快,几乎成了手机、安防摄像头、笔记本电脑这类设备的基础能力。对象检测、人脸识别、人数统计,是最常见的几个应用场景。这篇文章就带大家动手做一个基于Raspberry Pi和ThingSpeak的人群计数系统,用OpenCV搭桥,让Pi相机连续采集画面,然后靠
数字图像处理在今天的科技圈里,发展速度越来越快,几乎成了手机、安防摄像头、笔记本电脑这类设备的基础能力。对象检测、人脸识别、人数统计,是最常见的几个应用场景。这篇文章就带大家动手做一个基于Raspberry Pi和ThingSpeak的人群计数系统,用OpenCV搭桥,让Pi相机连续采集画面,然后靠HOG(方向梯度直方图)描述符来检测图像中的行人,再跟OpenCV预训练模型做比对,最终把人数实时传到ThingSpeak平台上——这样你就能从地球上任何一个角落远程监控现场的人流状况。
所需组件与准备工作
硬件
树莓派 3(任何版本都行)
Pi 摄像头模组
软件与在线服务
ThingSpeak(物联网数据平台)
Python 3.0
OpenCV 3.0
在树莓派上安装 OpenCV
OpenCV 是这个项目的核心图像处理库。先把树莓派系统更新一遍:
sudo apt-get update
然后安装编译 OpenCV 所需的依赖包:
sudo apt-get install libhdf5-dev -y
sudo apt-get install libhdf5-serial-dev -y
sudo apt-get install libatlas-base-dev -y
sudo apt-get install libjasper-dev -y
sudo apt-get install libqtgui4 -y
sudo apt-get install libqt4-test -y
依赖就绪后,用 pip 安装 OpenCV 的 Python 接口(指定版本 4.1.0.25):
pip3 install opencv-contrib-python==4.1.0.25
安装其他必要的 Python 包
开始编程前,还有两个常用的库需要装上。
imutils:负责图像平移、旋转、缩放、骨架化等常规操作,还能让 Matplotlib 显示 OpenCV 图像变得更容易。安装命令:
pip3 install imutils
matplotlib:Python 里最经典的绘图库,支持静态、动画和交互式可视化。安装命令:
pip3 install matplotlib
ThingSpeak 平台设置(用于人数统计上云)
ThingSpeak 是一个很受欢迎的物联网数据平台。用它来接收树莓派上传的人数数据,我们就能随时随地通过网页或手机查看。操作流程如下:

点击 Sign up,填入注册信息。

验证邮箱后,点击 Continue 继续。
登录成功,点击 New Channel 按钮创建新频道。

给频道取个名字,填上描述。这里我们只创建一个名为 People 的字段(当然你也可以根据需要添加多个字段)。
填完后点击 Sa ve Channel 保存。
最后一步:把通道的 Write API Key 和 Channel ID 复制下来,后面 Python 脚本里要用到这些凭证来上传数据。

硬件连接
这套系统只需要树莓派和 Pi 摄像头。将摄像头排线插入树莓派板上的相机接口即可。Pi 摄像头用处很多,除了这次的人群计数,你还可以用它做监控摄像头、访客监测系统、家庭安防等等。

人群计数 Python 代码详解
完整的代码附在文章末尾。这里先拆解几个关键部分,方便理解运行逻辑。
脚本开头,把所有需要用到的库导进来:
import cv2
import imutils
from imutils.object_detection import non_max_suppression
import numpy as np
import requests
import time
import base64
from matplotlib import pyplot as plt
from urllib.request import urlopen
接着填入 ThingSpeak 的频道 ID 和写入 API Key:
channel_id = 812060 # 你的频道ID
WRITE_API = 'X5AQ3EGIKMBYW31H' # 你的写密钥
BASE_URL = "https://api.thingspeak.com/update?api_key={}".format(WRITE_API)
然后初始化 HOG 描述符,并加载 OpenCV 预训练的行人检测模型:
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
detector() 函数:接收一张 RGB 图像,用 imutils 缩放到合适大小(宽度不超过 400 像素),然后调用 detectMultiScale() 方法,结合 SVM 的分类结果,判断图像中是否有人:
def detector(image):
image = imutils.resize(image, width=min(400, image.shape[1]))
clone = image.copy()
rects, weights = hog.detectMultiScale(image, winStride=(4, 4), padding=(8, 8), scale=1.05)
检测结果中有时会出现重叠的框,产生误报。所以需要用 imutils 提供的非极大值抑制(NMS)来合并重叠区域:
for (x, y, w, h) in rects:
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
rects = np.array([[x, y, x + w, y + h] for (x, y, w, h) in rects])
result = non_max_suppression(rects, probs=None, overlapThresh=0.7)
return result
record() 函数:通过 OpenCV 的 VideoCapture() 实时读取 Pi 摄像头画面,调整大小后交给 detector() 处理,最后将人数结果通过 HTTP 请求发送到 ThingSpeak 服务器:
def record(sample_time=5):
camera = cv2.VideoCapture(0)
frame = imutils.resize(frame, width=min(400, frame.shape[1]))
result = detector(frame.copy())
thingspeakHttp = BASE_URL + "&field1={}".format(result1)
运行与测试人群计数器
启动脚本前,先确认 Pi 摄像头工作正常。然后执行下面的命令运行程序:

屏幕上会弹出一个实时视频窗口。树莓派会抓取第一帧,通过 OpenCV 处理并标记行人。如果检测到人,每个人周围会画一个红色框(在代码里是绿色框,取决于绘制代码):

回到 ThingSpeak 频道,你会看到人数数据实时更新。只要联网,你就能从任何远程设备上查看当前的人流情况。

完整 Python 代码
import cv2
import imutils
from imutils.object_detection import non_max_suppression
import numpy as np
import requests
import time
import base64
from matplotlib import pyplot as plt
from urllib.request import urlopen
channel_id = 812060 # 在此处输入频道 ID
WRITE_API = 'X5AQ3EGIKMBYW31H' # 把你的写密钥放在这里
BASE_URL = "https://api.thingspeak.com/update?api_key={}".format(WRITE_API)
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
def detector(image):
image = imutils.resize(image, width=min(400, image.shape[1]))
clone = image.copy()
rects, weights = hog.detectMultiScale(image, winStride=(4, 4), padding=(8, 8), scale=1.05)
for (x, y, w, h) in rects:
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
rects = np.array([[x, y, x + w, y + h] for (x, y, w, h) in rects])
result = non_max_suppression(rects, probs=None, overlapThresh=0.7)
return result
def record(sample_time=5):
print("录音")
camera = cv2.VideoCapture(0)
init = time.time()
if sample_time < 3:
sample_time = 1
while True:
print("帽框")
ret, frame = camera.read()
frame = imutils.resize(frame, width=min(400, frame.shape[1]))
result = detector(frame.copy())
result1 = len(result)
print(result1)
for (xA, yA, xB, yB) in result:
cv2.rectangle(frame, (xA, yA), (xB, yB), (0, 255, 0), 2)
plt.imshow(frame)
plt.show()
if time.time() - init >= sample_time:
thingspeakHttp = BASE_URL + "&field1={}".format(result1)
print(thingspeakHttp)
conn = urlopen(thingspeakHttp)
print("发送结果")
init = time.time()
camera.release()
cv2.destroyAllWindows()
def main():
record()
if __name__ == '__main__':
main() 你是一名 AI 行业编辑,请围绕下面这条热点输出一份资讯解读:
热点:基于树莓派与OpenCV的人群计数装置设计与实现要求:
1. 先用一句话解释这条热点在讲什么
2. 再总结它为什么重要
3. 说明会影响哪些 AI 产品或内容方向
4. 最后给出 3 个适合资讯站使用的标题
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
相关热点度加剪辑是百度官方出品的剪辑工具,面向口播自媒体创作者。支持视频剪辑、智能识别字幕,并与百度网盘打通,可快速导入素材。适用于泛知识类创作者制作高质量视频,覆盖从素材导入到成品输出的完整流程。
WorkoutMaster是一款基于AI的个性化锻炼计划生成工具,能根据用户目标、偏好及历史训练记录,动态输出专属方案,并实时自适应调整负重、组次等参数。支持定制目标与器械偏好,借助机器学习持续优化,随时随地即可接入使用,确保训练高效安全。
Calorielens是一款利用AI分析餐食照片的卡路里追踪应用。用户只需拍照,AI即可自动识别食物种类和分量并估算卡路里,省去手动输入步骤。应用还提供历史记录追踪功能,帮助把握热量趋势。AI估算精度可满足日常健康管理需求。
百度旗下“简单搜索”AI搜索引擎集成语音、图像、多媒体搜索及实时翻译,支持多模态交互与智能推荐。基于大模型技术,用户可通过对话式交互直接获取精准答案,适用于学习、旅行、生活、职业发展等场景,高效满足信息需求。
- 日榜
- 周榜
- 月榜
热点快看
