在当今尖端技术的世界中,数字图像处理发展非常迅速,并成为许多数字设备的重要组成部分,如手机、安全摄像头、笔记本电脑等。
数字图像处理最常见的应用是对象检测、人脸识别和人数统计。所以在本教程中,我们将使用 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__':
主要的()
全部0条评论
快来发表一下你的评论吧 !