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

这是我用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 = 0
            for (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 = True
                            break
                        else:
                            print("未找到相同图像")
                            self.RoiImg(roiImg)
                else:
                    self.image_list.append(f_code)
                    self.RoiImg(roiImg)
                i += 1
    except Exception as e:
        print(str(e))
    return image

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

python 复制代码
def RoiImg(self, image):
    # 将人脸图像加载到右侧QLabel
    im1 = 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)

    # 添加新的Label
    label = 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 % count
    self.glay.addWidget(label, row, colum)
    self.index += 1
    self.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

相关推荐
正经教主1 分钟前
【Trae+AI】和Trae学习搭建App_2.2.1:第4章·安卓APP调用Express后端实战1:前端调用后端
人工智能·学习·express
老蒋新思维2 分钟前
创客匠人峰会深度解析:知识变现的 “IP 资产化” 革命 —— 从 “运营流量” 到 “沉淀资产” 的长期增长逻辑
大数据·人工智能·网络协议·tcp/ip·创始人ip·创客匠人·知识变现
瀚岳-诸葛弩5 分钟前
对比tensorflow,从0开始学pytorch(三)--自定义层
人工智能·pytorch·tensorflow
测试人社区-小明7 分钟前
AI在金融软件测试中的实践
人工智能·测试工具·金融·pycharm·机器人·github·量子计算
小哲慢慢来8 分钟前
机器学习基本概念
人工智能·机器学习
张较瘦_10 分钟前
[论文阅读] AI + 软件工程 | 叙事的力量+专家智慧:解锁定性软件工程研究的过去、现在与未来
论文阅读·人工智能·软件工程
算法与编程之美12 分钟前
机器学习测试模型的性能评估与探索
人工智能·机器学习
小毅&Nora16 分钟前
【人工智能】【深度学习】 ⑩ 图神经网络(GNN)从入门到工业落地:消息传递、稀疏计算与推荐/风控实战
人工智能·深度学习·图神经网络gnn
zhangfeng113316 分钟前
大语言模型Ll M 这张图的核心信息是:随着模型规模变大,注意力(attention)层消耗的 FLOPs 占比越来越高,而 MLP 层占比反而下降。
人工智能
你那是什么调调18 分钟前
大语言模型如何“思考”与“创作”:以生成一篇杭州游记为例
人工智能·语言模型·chatgpt