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

ops/2024/11/24 20:59:51/

这是我用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/ops/136398.html

相关文章

SpringMVC-Day1

SpringMVC 1.SpringMVC介绍 springMVC是一种基于Java实现MVC模型的轻量级Web框架 优点: 使用简单,开发便捷(相较于Servelt) 灵活性强 使用SpringMVC技术开发web程序流程 创建web工程(Maven结构) 设置…

Flink Transformation - 转换算子全面解析

Flink Transformation - 转换算子全面解析 一、引言 在Flink的数据流处理中,转换算子(Transformation Operators)扮演着极为关键的角色。它们能够对输入的数据流进行各种处理和转换操作,以满足不同的业务需求。本文将详细介绍Fl…

Arduino UNO驱动ADS1220模数转换模块

文章目录 简介ADS1220特性参数ADS1220模数转换模块原理图Arduino UNO与ADS1220接线简单测试K型热电偶测试 简介 ADS1220 是一款精密的 24 位模数转换器 (ADC),它提供许多集成功能,可降低测量小传感器信号的应用中的系统成本和元件数量。该器件具有两个差…

webkit浏览器内核编译(2024年11月份版本)

webkit浏览器内核编译 本文详细介绍了如何安装和配置Webkit的编译环境和工具的安装,以及在Windows上编译和运行WebKit浏览器引擎的过程,包括安装依赖、设置环境变量、生成解决方案并最终运行附带的MiniBrowser示例。 一、WebKit简介 WebKit 是一个开源的…

AR智能眼镜|AR眼镜定制开发|工业AR眼镜方案

AR眼镜的设计与制造成本主要受到芯片、显示屏和光学方案的影响,因此选择合适的芯片至关重要。一款优秀的芯片平台能够有效提升设备性能,并解决多种技术挑战。例如,采用联发科八核2.0GHz处理器,结合12nm制程工艺,这种低…

Linux:进程

✨✨所属专栏:Linux✨✨ ✨✨作者主页:嶔某✨✨ 冯诺依曼体系结构 现代计算机发展所遵循的基本结构形式始终是冯诺依曼结构。这种结构特点是“程序存储,共享数据,顺序执行”,需要CPU从存储器取出指令和数据进行相应的…

秋招面试基础总结,Java八股文基础(串联知识),四万字大全

目录 值传递和引用传递 静态变量和静态代码块的执行顺序 Java​​​​​​​集合的框架,Set,HashSet,LinkedHashSet这三个底层是什么 多线程篇 Java实现多线程的方式 假设一个线程池,核心线程数是2,最大线程数是3,阻塞队列是4…

一种构建网络安全知识图谱的实用方法

文章主要工作 论述了构建网络安全知识库的三个步骤,并提出了一个构建网络安全知识库的框架;讨论网络安全知识的推演 1.框架设计 总体知识图谱框架如图1所示,其包括数据源(结构化数据和非结构化数据)、信息抽取及本体构建、网络…