使用Raspberry Pi构建一个OpenCV人群计数装置

描述

  在当今尖端技术的世界中,数字图像处理发展非常迅速,并成为许多数字设备的重要组成部分,如手机、安全摄像头、笔记本电脑等。

  数字图像处理最常见的应用是对象检测、人脸识别和人数统计。所以在本教程中,我们将使用 Raspberry Pi 和 ThingSpeak 构建一个 OpenCV 人群计数。在这里,pi 相机模块将用于连续捕获帧,然后将这些帧用HOG(面向直方图的对象描述符)处理以检测图像中的对象。在此之后,这些帧将与 OpenCV 的预训练模型进行比较以进行人员检测。人数统计将显示在 ThingSpeak 频道上,可以从世界任何地方进行监控。

  所需组件

  硬件

  树莓派 3(任何版本)

  派相机

  软件和在线服务

  物语

  Python3.0

  开放CV3.0

在树莓派中安装 OpenCV

这里将使用 OpenCV 库来检测人群。要安装 OpenCV,首先,更新 Raspberry Pi。

 

sudo apt-get 更新

 

然后安装在 Raspberry Pi 上安装 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

 

之后,使用以下命令在 Raspberry Pi 中安装 OpenCV。

 

pip3 安装 opencv-contrib-python==4.1.0.25

 

  安装其他必需的软件包

  在对 Raspberry Pi 进行人群计数编程之前,让我们安装其他所需的软件包。

  安装imutils: imutils 用于执行一些必要的图像处理功能,例如平移、旋转、调整大小、骨架化,以及使用 OpenCV 更轻松地显示 Matplotlib 图像。因此,使用以下命令安装imutils :

  pip3 安装 imutils

  matplotlib:之后,安装matplotlib库。Matplotlib是一个综合库,用于在 Python 中创建静态、动画和交互式可视化。

  pip3 安装 matplotlib

  人数统计的 ThingSpeak 设置

  ThingSpeak 是一个非常流行的物联网平台,通过使用 ThingSpeak 平台,我们可以从任何地方通过互联网监控我们的数据。

计数器

  单击 Sing up 并输入您的详细信息。

计数器

  在此之后,验证您的电子邮件 ID,然后单击继续。

  现在,登录后,单击“新建频道”按钮创建一个新频道。

计数器

  单击“新频道”后,输入您要在此频道上上传的数据的名称和描述。在这里,我们创建了一个名为People的字段。可根据需要创建多个字段。

  在此之后,单击保存频道按钮以保存详细信息。

  要将数据发送到 ThingSpeak,请在 Python 脚本中输入 API 密钥和通道 ID,然后复制 API 密钥和通道 ID。

计数器

  硬件设置

  在这里,我们只需要 Raspberry Pi 和 Pi 相机来完成这个OpenCV 人员计数项目,您只需将相机带状连接器连接到 Raspberry pi 中提供的相机插槽中

计数器

  Pi 摄像头可用于构建各种有趣的项目,如Raspberry Pi 监控摄像头、访客监控系统、家庭安全系统等。

人员计数器的Python程序说明

此人群计数 OpenCV 项目的完整 Python 代码在页面末尾给出。在这里,我们将解释代码的重要部分,以便更好地解释。

因此,在代码开始时,导入将在此项目中使用的所有必需库。

 

导入简历2
导入 imutils
从 imutils.object_detection 导入 non_max_suppression
将 numpy 导入为 np
导入请求
进口时间
导入base64
从 matplotlib 导入 pyplot 作为 plt
从 urllib.request 导入 urlopen​

 

导入库后,输入 ThingSpeak 频道 ID 并写入您之前复制的 API 密钥。

 

channel_id = 812060 # 在此处输入频道 ID
WRITE_API = 'X5AQ3EGIKMBYW31H' # 把你的写密钥放在这里
BASE_URL = "https://api.thingspeak.com/update?api_key= {}".format(WRITE_API)

 

现在,初始化 HOG(面向直方图的对象描述符)。HOG 是最流行的目标检测技术之一,并已在多个应用中使用。cv2.HOGDescriptor_getDefaultPeopleDetector() 用于调用 OpenCV 的预训练模型进行人员检测。我们之前在之前的 OpenCV 教程中详细解释过 HOG 。

 

猪 = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())

 

在检测器()内部, Pi 接收到一个 RGB 图像,该图像被分成三个颜色通道。之后,它使用imutils调整图像大小。然后它调用detectMultiScale()方法来分析图像,使用 SVM 模型的分类结果来了解是否存在人。

 

def检测器(图像):
   image = imutils.resize(image, width=min(400, image.shape[1]))
   克隆 = image.copy()
   rects, weights = hog.detectMultiScale(image, winStride=(4, 4), padding=(8, 8), scale=1.05)

 

有时捕获框重叠并产生误报或检测错误,因此下面的代码将imutils的非最大抑制应用于启动重叠框。

 

对于矩形中的 (x, y, w, h):
       cv2.rectangle(图像, (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])
   结果 = non_max_suppression(rects,probs=None,overlapThresh=0.7)
   返回结果

 

在record()函数中,它使用 OpenCV 中的VideoCapture()方法直接从 Pi 相机中检索图像,使用 imultis 调整图像大小并将结果发送到 ThingSpeak。

 

def 记录(sample_time=5):
  相机 = cv2.VideoCapture(0)
frame = imutils.resize(frame, width=min(400, frame.shape[1]))
结果=检测器(frame.copy())
thingspeakHttp = BASE_URL + "&field1={}".format(result1)

 

  测试 OpenCV 人员计数器

  在启动 python 脚本之前,首先检查您的 PI 相机是否工作。检查相机后,通过发出以下命令启动 python 脚本:

计数器

  然后你会发现弹出一个窗口,里面有你的视频源。Pi 将获取第一帧并使用 OpenCV 对其进行处理以检测人数。如果它检测到人,你会在它周围找到一个像这样的框:

计数器

  现在检查您的 ThingSpeak 频道,您可以在其中监控来自世界任何地方的人群规模。

计数器

导入简历2
导入 imutils
从 imutils.object_detection 导入 non_max_suppression
将 numpy 导入为 np
导入请求
进口时间
导入base64
从 matplotlib 导入 pyplot 作为 plt
从 urllib.request 导入 urlopen
channel_id = 812060 # 在此处输入频道 ID
WRITE_API = 'X5AQ3EGIKMBYW31H' # 把你的写密钥放在这里
BASE_URL = "https://api.thingspeak.com/update?api_key={}".format(WRITE_API)
猪 = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
# 在[3]:
def检测器(图像):
image = imutils.resize(image, width=min(400, image.shape[1]))
克隆 = image.copy()
rects, weights = hog.detectMultiScale(image, winStride=(4, 4), padding=(8, 8), scale=1.05)
对于矩形中的 (x, y, w, h):
cv2.rectangle(图像, (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])
结果 = non_max_suppression(rects,probs=None,overlapThresh=0.7)
返回结果
def 记录(sample_time=5):
打印(“录音”)
相机 = cv2.VideoCapture(0)
初始化 = time.time()
# ubidots 样本限制
如果 sample_time < 3:
采样时间 = 1
而(真):
打印(“帽框”)
ret, frame = camera.read()
frame = imutils.resize(frame, width=min(400, frame.shape[1]))
结果=检测器(frame.copy())
结果1 = len(结果)
打印(结果1)
对于 (xA, yA, xB, yB) 结果:
cv2.rectangle(frame, (xA, yA), (xB, yB), (0, 255, 0), 2)
plt.imshow(帧)
plt.show()
# 发送结果
如果 time.time() - init >= sample_time:
thingspeakHttp = BASE_URL + "&field1={}".format(result1)
打印(thingspeakHttp)
conn = urlopen(thingspeakHttp)
print("发送结果")
初始化 = time.time()
相机.release()
cv2.destroyAllWindows()
# 在[7]:
定义主():
记录()
# 在[8]:
如果 __name__ == '__main__':
主要的()

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分