解决人脸识别考勤系统中重复写入CSV文件的问题

DDD
发布: 2025-10-21 13:04:17
原创
347人浏览过

解决人脸识别考勤系统中重复写入csv文件的问题

本文旨在解决在使用OpenCV进行人脸识别考勤时,由于代码逻辑问题导致考勤信息重复写入CSV文件的问题。通过分析问题代码,找出重复写入的原因,并提供修改后的代码示例,确保考勤记录的准确性和唯一性。文章还讨论了进一步优化方案,例如将已记录的名字列表保存在内存中,避免重复读取文件,提高程序效率。

在人脸识别考勤系统中,实时从摄像头捕获图像,识别出人脸并记录考勤信息是常见的需求。然而,在实际应用中,可能会遇到重复记录考勤信息的问题。本文将针对这个问题,提供详细的解决方案和优化建议。

问题分析

原代码的问题在于 markAttendance 函数中,每次检测到人脸时,都会打开 Attendance.csv 文件,读取所有行,然后检查当前识别到的人名是否已存在于列表中。由于 if name not in nameList: 语句位于 for 循环内部,因此每次循环都会进行一次判断,导致在同一帧图像中多次识别到同一张脸时,会重复写入考勤信息。

解决方案

核心思路是将判断人名是否已存在于列表中的逻辑,从 for 循环内部移到循环外部,确保只有在读取完所有已存在的人名后,才进行判断和写入操作。

以下是修改后的 markAttendance 函数代码:

def markAttendance(name):
    with open('Attendance.csv','r+') as f:
        myDataList = f.readlines()
        nameList = []
        for line in myDataList:
            entry = line.split(',')
            nameList.append(entry[0])
        # 循环结束后再进行判断
        if name not in nameList:
            now = datetime.now()
            dtString = now.strftime('%H:%M:%S')
            f.writelines(f'\n{name},{dtString}')
登录后复制

代码解释:

  1. 读取所有已存在的人名: 首先,打开 Attendance.csv 文件,读取所有行,并将每行的人名添加到 nameList 列表中。
  2. 判断人名是否已存在: 在循环结束后,判断当前识别到的人名 name 是否已存在于 nameList 列表中。
  3. 写入考勤信息: 如果 name 不在 nameList 列表中,则获取当前时间,并将人名和时间写入 Attendance.csv 文件。

进一步优化:将已记录的名字列表保存在内存中

每次调用 markAttendance 函数都读取整个 CSV 文件效率较低。更优化的方案是在程序启动时一次性读取所有已记录的名字,并将其保存在内存中。后续的考勤记录直接与内存中的列表进行比较,只有在发现新的人名时才写入文件,并更新内存中的列表。

AI建筑知识问答
AI建筑知识问答

用人工智能ChatGPT帮你解答所有建筑问题

AI建筑知识问答 22
查看详情 AI建筑知识问答

以下是优化后的代码示例:

def readNames():
    with open('Attendance.csv', 'r') as f:
        nameList = []
        for line in f:
            entry = line.split(',')
            nameList.append(entry[0])
    return nameList

def markAttendance(name, nameList):
    if name not in nameList:
        nameList.append(name)   # add directly to list
        # write to file
        with open('Attendance.csv', 'a') as f:
            dt = datetime.now().strftime('%H:%M:%S')
            f.writelines(f'\n{name},{dt}')

# --- 程序启动时 ---
nameList = readNames()   # read only once at start

# --- 在主循环中 ---
while True:
    # ...
    if matches[matchIndex]:
        # ...
        markAttendance(name, nameList)
登录后复制

代码解释:

  1. readNames() 函数: 在程序启动时调用,读取 Attendance.csv 文件中的所有人名,并返回一个列表。
  2. markAttendance(name, nameList) 函数: 接收人名和内存中的 nameList 作为参数。如果人名不在 nameList 中,则将其添加到 nameList 中,并将考勤信息写入 Attendance.csv 文件。
  3. 程序启动时: 调用 readNames() 函数,将已记录的人名加载到 nameList 列表中。
  4. 主循环中: 在检测到人脸后,调用 markAttendance(name, nameList) 函数进行考勤记录。

注意事项:

  • 在多线程或多进程环境中,需要考虑线程安全或进程安全问题,确保对 nameList 的访问是同步的。
  • 如果 Attendance.csv 文件非常大,一次性读取可能会占用大量内存。可以考虑使用数据库或其他更高效的数据存储方式。

总结

本文针对人脸识别考勤系统中重复写入 CSV 文件的问题,提供了两种解决方案:

  1. 修改 markAttendance 函数的逻辑,将判断人名是否已存在的逻辑移到循环外部。 这种方法简单易懂,适用于数据量较小的情况。
  2. 将已记录的名字列表保存在内存中,避免重复读取文件。 这种方法可以提高程序效率,适用于数据量较大的情况。

选择哪种方案取决于具体的应用场景和性能需求。在实际应用中,可以根据需要进行调整和优化,以达到最佳的考勤效果。

以上就是解决人脸识别考勤系统中重复写入CSV文件的问题的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号