基于OpenCV的自制Python访客识别程序

server/2024/11/18 10:01:17/

这是我用Pyqt5,基于OpenCV做的一个Python访客识别程序,它具体包括如下5个功能:

1、选择媒体菜单,可以打开本地摄像头;如果知道rtsp地址,则可以直接访问局域网内的网络串流。

2、选择播放菜单,可以播放/暂停当前正在播放中的视频信息。

3、视频播放过程,应用会每隔1秒扫描一次屏幕中出现的访客并通过识别判断是否是新访客。

4、若是新访客的,右边今日访客栏中就会将该访客人脸图像展示出来。

5、今日访客数会根据新增访客图像的增加而同步更新。

由于直接用的是OpenCV自带的模型,所以戴口罩的人脸是无法区分的。这个暂且不做拓展讨论。

这个程序的功能其实说白了就是用OpenCV打开摄像头,然后进行人脸识别,识别的人脸数据会存储在一个image_list的数组中,若在image_list中没有发现相同图像,就会在右侧Qlabel添加一个新的label并把新增人脸贴上去。

现在来介绍下这个程序的核心代码实现,完整的代码会在文章结尾处放置链接。

先说打开摄像头播放或暂停的功能,这个功能我在以前的博文中已经具体介绍过,参看Python学习之用QTimer计时器实现摄像头视频的播放和暂停_pyqt5摄像头暂停-CSDN博客。

然后是人脸识别功能,不多废话,直接上代码:

python">def TrackingFace(self, image):try:faces = face_recognition.face_locations(image)encodings = face_recognition.face_encodings(image, faces)if faces != ():i = 0for (y, w, h, x), f_code in zip(faces, encodings):image = cv2.rectangle(image, (x, y), (w,  h), (0, 0, 255), 2)# 获取识别的人脸roiImg = image[y:h, x:w]if len(self.image_list) > 0:# 看看面部是否与已知人脸相匹配。for j, v in enumerate(self.image_list):# print(f'{j}: {v}')match = face_recognition.compare_faces([v], f_code, tolerance=0.6)if match[0]:print("找到相同图像")self.flag = Truebreakelse:print("未找到相同图像")self.RoiImg(roiImg)else:self.image_list.append(f_code)self.RoiImg(roiImg)i += 1except Exception as e:print(str(e))return image

接下来是将未找到的图像贴到访客墙上的功能:

python">def RoiImg(self, image):# 将人脸图像加载到右侧QLabelim1 = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)im1 = cv2.putText(im1, self.timestr, (10, image.shape[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)im2 = QtGui.QImage(im1[:], im1.shape[1], im1.shape[0], im1.shape[1] * 3, QtGui.QImage.Format_RGB888)im3 = QtGui.QPixmap(im2).scaled(150, 200)# 添加新的Labellabel = QLabel()label.setFixedSize(60, 100)label.setStyleSheet("border:1px solid gray")label.setPixmap(im3)label.setScaledContents(True)count = int(self.scrollArea.width() / 80)row = int(self.index / count)colum = self.index % countself.glay.addWidget(label, row, colum)self.index += 1self.label_3.setText(str(self.index))

最后,还有个每隔1s扫描一次人脸,其实就是拿两个时间戳进行对比:

python">t1 = datetime.strptime(self.timestr, '%Y-%m-%d %H:%M:%S')
t2 = datetime.strptime(timestr0, '%Y-%m-%d %H:%M:%S')
seconds = (t2 - t1).seconds
# print('t1=' + str(t1), 't2=' +str(t2), 'seconds=' + str(seconds))
if seconds > 1:  # 每隔1秒扫描一次人脸self.timestr = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())self.TrackingFace(color_frame)

好了,核心代码就这几段了。完整的详细代码下载地址:

https://download.csdn.net/download/hydekong/89992827


http://www.ppmy.cn/server/142879.html

相关文章

【大数据测试HDFS + Flask详细教程与实例】

大数据测试HDFS Flask 1. 环境准备安装工具安装Hadoop(以单机模式为例)安装Flask和HDFS Python客户端 2. HDFS Flask基本架构基本文件结构 3. 创建Flask应用与与HDFS交互步骤1:配置HDFS连接步骤2:构建Flask应用 4. 创建前端界面…

深度学习和图像处理

看来你对深度学习和图像处理很感兴趣呢,让我来一一解答你的疑惑吧。 深度学习高纬度特征 首先,我猜你是想问“深度学习中的高维特征”吧。在深度学习中,随着网络层数的加深,网络的感受野逐渐变大,语义表达能力也随之增…

moduo之阻塞队列BlockingQueue和BoundedBlockingQueue

简介 moduo中的队列与java线程池中的队列类似, 有无界阻塞队列和有界阻塞队列 结构 #mermaid-svg-Gf8nET825tZgzVRM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Gf8nET825tZgzVRM .error-icon{fill…

虚幻引擎 CEO 谈元宇宙:发展、策略与布局

在当今科技领域,元宇宙无疑是最热门的话题之一。Epic Games 首席执行官 Tim Sweeney 对元宇宙的未来发展充满信心,他认为开放元宇宙将融合娱乐、游戏和科技产业,带来一个光明的未来。本文将深入探讨采访中的关键内容,分析元宇宙的…

rhce.6

一、DNS域名解析服务器 DNS ( Domain Name System )是互联网上的一项服务,它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便的访问互联网。DNS 系统使用的是网络的查询,那么自然需要有监听的 port 。…

谷粒商城のRedisESRabbit MQ集群

文章目录 前言一、搭建Redis集群三、搭建ES集群三、搭建Rabbit MQ集群 前言 本篇是谷粒商城集群部署篇,搭建Redis、ES、Rabbit MQ集群实践的个人笔记,也是谷粒商城笔记的最后一篇。集群相关的理论性内容,会放在面试篇的笔记中。 一、搭建Redi…

AXI DMA IP BUG踩坑记录

1. 问题描述 在突发的过程中总是一旦使用XAxiDma_SimpleTransfer函数就会出现AXI STREAM信号的READY信号先拉高4个数据(32位)的时钟后会迅速拉低,换句话说就是一旦PS端发起了XAxiDma_SimpleTransfer,AXI总线的READY信号就会拉高四个节拍,这样就会导致传输的数据出现问题。…

MySQL如何解决幻读?

目录 一、什么是幻读? 1.1 幻读的定义 1.2 幻读的示例 1.3 幻读产生的原因? 1.4 读已提交(Read Committed) 1.4.1 确定事务等级 1.4.2 非锁定读取 准备 示例 结论 1.4.3 锁定读取 准备 示例 分析 结论 1.5 可重复读…