Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
解决人脸识别考勤系统重复写入CSV文件的问题_创想鸟

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

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

本文针对基于OpenCV和face_recognition库构建的人脸识别考勤系统,解决了在摄像头持续识别人脸时,重复将考勤记录写入CSV文件的问题。通过调整代码逻辑,确保每个人只记录一次考勤信息,并提供优化建议,提高程序效率。

在构建人脸识别考勤系统时,一个常见的挑战是避免重复记录考勤信息。以下将详细介绍如何修改代码,确保每个人只记录一次考勤,并提供一些优化建议。

问题分析

原始代码在主循环中,每次检测到人脸匹配时,都会调用 markAttendance 函数。由于摄像头帧率很高,即使人脸只出现一次,也会被多次检测到,导致重复写入 CSV 文件。

解决方案

核心思路是:在将姓名写入文件之前,先检查该姓名是否已经存在于已记录的姓名列表中。如果存在,则跳过写入操作;否则,才进行写入。以下是修改后的 markAttendance 函数:

from datetime import datetimedef 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}')

代码解释:

读取现有数据: f.readlines() 读取整个文件的所有行,并将其存储在 myDataList 列表中。提取已记录的姓名: 循环遍历 myDataList,将每一行按照逗号分隔,提取出姓名,并将其添加到 nameList 列表中。检查姓名是否已存在: 使用 if name not in nameList: 判断当前检测到的姓名是否已经存在于 nameList 中。写入考勤记录: 如果姓名不存在,则获取当前时间,格式化为字符串,并将姓名和时间写入 CSV 文件。

优化建议

虽然上述代码可以解决重复写入的问题,但每次调用 markAttendance 函数时都读取整个 CSV 文件效率较低。可以进行以下优化:

在程序启动时读取姓名列表: 在程序启动时,一次性读取 CSV 文件中的所有姓名,并将其存储在内存中。更新内存中的姓名列表: 每次成功写入新的考勤记录后,立即将该姓名添加到内存中的姓名列表中。使用 “a” 模式打开文件: 在markAttendance函数中使用追加模式 “a” 打开文件,而不是 “r+” 模式,简化写入操作。

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

def readNames():    try:        with open('Attendance.csv', 'r') as f:            nameList = [line.split(',')[0] for line in f]    except FileNotFoundError:        # 如果文件不存在,创建一个空文件并返回一个空列表        open('Attendance.csv', 'w').close()        nameList = []    return nameListdef markAttendance(name, nameList):    if name not in nameList:        nameList.append(name)        with open('Attendance.csv', 'a') as f:            dt = datetime.now().strftime('%H:%M:%S')            f.writelines(f'n{name},{dt}')# --- 主程序 ---nameList = readNames()  # 在程序启动时读取姓名列表cap = cv2.VideoCapture(0)while True:    # ... (人脸识别代码) ...    for encodeFace, faceLoc in zip(encodesCurFrame, facesCurFrame):        matches = face_recognition.compare_faces(encodeListKnown, encodeFace)        faceDis = face_recognition.face_distance(encodeListKnown, encodeFace)        matchIndex = np.argmin(faceDis)        if matches[matchIndex]:            name = classNames[matchIndex].upper()            # ... (绘制矩形框和文字) ...            markAttendance(name, nameList) # 传递 nameList

代码解释:

readNames() 函数: 在程序启动时调用,读取 CSV 文件中的所有姓名,并将其存储在 nameList 列表中。增加了异常处理,如果文件不存在则创建。markAttendance() 函数: 接收 nameList 作为参数,直接在内存中进行姓名检查,并将新的姓名添加到 nameList 中。使用 “a” 模式打开文件,进行追加写入。主程序: 在主循环中,将 nameList 传递给 markAttendance() 函数。

注意事项

确保 CSV 文件存在,并且具有正确的格式(姓名,时间)。如果文件不存在,readNames() 函数会创建一个空文件。根据实际情况调整人脸识别的灵敏度,避免误识别导致错误的考勤记录。可以考虑使用数据库存储考勤数据,以便进行更复杂的查询和分析。

总结

通过在写入 CSV 文件之前进行姓名检查,可以有效地避免重复写入考勤记录。通过在程序启动时读取姓名列表,并将其存储在内存中,可以提高程序的效率。根据实际情况选择合适的优化方案,可以构建一个稳定、高效的人脸识别考勤系统。

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1378009.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
# 使用调试和打印技巧调试多函数依赖的Python代码
上一篇 2025年12月14日 18:16:18
使用 Python 模拟 Shell 环境:实现命令链式执行
下一篇 2025年12月14日 18:16:37

相关推荐

  • Java中高效查找时空事件重叠的方法

    本文探讨了在Java中高效查找具有空间和时间范围定义的事件之间重叠的解决方案。核心思想是将时空事件编码为二维矩形,然后利用专业的空间索引结构(如R树、四叉树或PH树)进行快速查询。通过这种方法,可以显著提升在大规模数据集中识别事件重叠的效率,并提供了使用Tinspin索引库的示例代码和实践建议。 时…

    2026年9月21日
    000
  • 苹果手机怎么卸载app

    一、常规删除方式 最常用的卸载方法非常直观。只需长按想要移除的app图标,图标会进入抖动状态,同时左上角出现一个“×”标志。点击这个“×”,随后在跳出的提示框中选择“删除app”,即可完成卸载。卸载后,该应用将从主屏幕消失,并释放其所占用的存储空间。 二、保留数据的卸载方式 若你只是暂时不使用某个应…

    2026年9月21日
    000
  • 如何为iPhone12ProMax下载固件?快速获取方法分享

    首先通过苹果官方开发者中心、第三方固件网站或iTunes/Finder获取iPhone 12 Pro Max的正确固件文件,确保来源可靠并校验完整性,再进行系统降级或修复操作。 如果您尝试为您的iPhone 12 Pro Max进行系统降级或修复系统错误,但无法找到合适的固件文件,则可能是由于下载渠…

    2026年9月21日
    000
  • 使用EventBus实现Android实时速度显示与后台保存教程

    本教程详细介绍了如何在Android应用中实现实时速度的显示与后台保存功能。通过利用前台服务(Foreground Service)获取位置数据,并结合EventBus库实现服务与UI界面(MainActivity)之间的实时数据通信,确保即使应用处于后台或屏幕关闭时,速度数据也能持续更新并显示在用…

    2026年9月21日
    000
  • google浏览器CPU占用率过高怎么解决_google浏览器CPU占用过高解决方法

    Chrome CPU占用过高可通过清除缓存、禁用高耗能扩展、结束高占用进程、更新浏览器、关闭硬件加速及禁用Software Reporter Tool解决。 如果您在使用Google Chrome浏览器时发现电脑运行缓慢或风扇狂转,很可能是由于Chrome的CPU占用率过高导致系统资源被大量消耗。以…

    2026年9月21日
    000
  • Steam游戏平台下载缓存怎么清理_Steam清理下载缓存的方法

    清理Steam下载缓存可解决下载慢、中断或安装失败问题。首先可通过客户端设置中的“清除下载缓存”功能操作,随后重新登录账户;若无效,可手动删除Steam安装目录下的appcache和depotcache文件夹;此外,重置网络配置并执行netsh winsock reset与ipconfig /flu…

    2026年9月21日
    000
  • 百度极速版如何开启数据同步_百度极速版数据同步的设置方法

    用同一百度账号登录百度极速版是开启数据同步的关键,进入【我的】→【设置】→开启【书签同步】,完成账号绑定后,书签和搜索记录即可在多设备间自动同步。 想在不同设备上无缝使用百度极速版,开启数据同步是关键。只要用同一个百度账号登录,你的书签、搜索记录等信息就能自动保持一致。操作本身不难,主要是找到正确的…

    2026年9月21日
    000
  • win10打开图片提示“没有注册类”怎么办_win10图片打开注册类错误解决方案

    首先重置照片应用并修复系统文件,再通过PowerShell重新注册应用包,最后调整默认应用关联以解决“没有注册类”错误。 如果您尝试在Windows 10中打开图片文件,但系统弹出“没有注册类”的错误提示,则可能是由于默认图片查看应用的注册信息丢失或损坏。以下是解决此问题的步骤: 本文运行环境:De…

    2026年9月21日
    200
  • 怎么全选VSCode多个光标_VSCode多光标操作与批量选择文本教程

    VSCode中高效创建多光标的方法包括:Alt+Click手动添加光标,适用于不规则位置;Ctrl+Alt+方向键垂直添加光标,适合连续多行操作;Ctrl+D逐个选择匹配项,精准控制选择范围;Ctrl+Shift+L一次性选择所有匹配项,实现全局批量修改。结合查找替换和列选择模式可进一步提升编辑效率…

    2026年9月21日
    100
  • 小红书从哪里看私信记录?私信记录如何清理?

    在小红书上与朋友或喜欢的博主互动时,私信是必不可少的沟通方式。不少新手用户常常困惑于如何查找过往的聊天内容。本文将为你详细说明查看私信记录的具体步骤,并分享几种实用的清理方法,帮助你轻松管理私信箱,让对话界面更清爽。 一、如何找到小红书的私信记录? 查看私信的操作非常直观,只需几个简单步骤即可完成。…

    2026年9月21日
    000
  • PHP框架中间件有什么用处_PHP框架中间件设计与实现

    PHP框架中间件是处理请求和响应的过滤器,用于实现身份验证、日志记录、CORS等通用逻辑,核心价值在于解耦和提升可维护性。通过定义中间件接口、具体中间件类及管道调度器可实现自定义中间件,如身份验证或CORS处理。在Laravel中可通过Kernel.php配置全局、分组或路由级中间件,执行顺序按注册…

    2026年9月21日
    100
  • win10登录界面不显示用户头像或名称怎么办_恢复登录界面完整显示的操作方法

    登录界面缺少头像或账户名时,先检查账户名一致性,修复头像缓存,重设头像,扫描系统文件,必要时创建新管理员账户验证问题。 如果您在启动Windows 10后,登录界面仅显示密码输入框而缺少用户头像或账户名称,则可能是由于系统设置、缓存异常或账户配置问题导致。以下是恢复登录界面完整显示的详细操作方法。 …

    2026年9月21日
    100
  • Java多线程API调用中Future.get()返回null的解决方案

    本文旨在解决%ignore_a_1%api调用中`future.get()`方法返回`null`的常见问题。当使用`callable`和`executorservice`并发执行api请求并尝试获取结果时,如果流读取逻辑不当,可能导致获取到的数据为空。文章将详细解释问题根源,并提供使用`string…

    2026年9月21日
    100
  • 交管12123处理非本人车辆违章怎么办_交管12123处理非本人车辆违章攻略

    可通过“交管12123”APP处理非本人名下车辆的交通违法,但需先完成备案。备案方式有两种:一是扫码备案,由车主生成二维码后驾驶人扫描并提交信息;二是短信验证备案,输入车牌号、发动机号后六位,系统向车主手机发送验证码,输入后完成备案。备案成功后,进入APP【更多】→【违法处理】,选择已备案车辆,查看…

    2026年9月21日
    000
  • 哔哩哔哩怎么设置点赞和投币记录为私密_哔哩哔哩点赞投币隐私设置

    1、进入哔哩哔哩App个人主页,点击头像进入个人空间,通过右上角菜单进入设置;2、开启“隐藏我的点赞”功能,防止他人查看点赞记录;3、在隐私权限设置中关闭“展示投币动态”,限制投币行为的公开显示;4、手动检查并删除或隐藏历史动态中的互动记录,确保过往点赞与投币不被他人可见。 如果您希望在使用哔哩哔哩…

    2026年9月21日
    100
  • 如何为VSCode设置最小化到系统托盘?

    VSCode不支持内置最小化到系统托盘功能,可通过第三方工具实现:Windows推荐使用RBTray或AutoHotkey脚本,Linux可借助AppIndicator扩展,macOS则依赖Dock最小化及辅助工具视觉隐藏。 VSCode 本身不提供内置的“最小化到系统托盘”功能,但可以通过一些方法…

    2026年9月21日
    100
  • 怎样在iPhone情侣模式中设置情侣专属表情?个性化聊天的技巧

    怎样在iPhone情侣模式中设置情侣专属表情?个性化聊天的技巧怎样在iPhone情侣模式中设置情侣专属表情?个性化聊天的技巧怎样在iPhone情侣模式中设置情侣专属表情?个性化聊天的技巧怎样在iPhone情侣模式中设置情侣专属表情?个性化聊天的技巧

    通过Memoji、第三方贴纸应用和iOS 16+抠图功能,可为情侣打造专属表情包;结合自定义聊天背景、语音消息、共享相册等方式,既能提升聊天趣味性,又能保持沟通效率,增强情感连接。 在iPhone上设置情侣专属表情,与其说是开启一个内置的“情侣模式”,不如说是巧妙利用iOS系统和第三方应用提供的各种…

    2026年9月21日 • 用户投稿
    100
  • PHP 数组值比较与嵌套数组过滤教程

    本教程详细讲解如何在 PHP 中比较一个简单数组与一个复杂嵌套数组,并根据特定条件(如文件名匹配)过滤嵌套数组中的所有相关子数组。我们将通过识别非匹配项的索引,然后从所有子数组中移除这些项并重新索引,实现精确的数据筛选。 问题背景 在 php 开发中,我们经常会遇到需要处理结构复杂的数组数据。例如,…

    2026年9月21日
    200
  • 美图秀秀导出视频卡住 美图视频保存失败修复方案

    导出视频卡住或保存失败,通常和设备性能、软件状态或操作方式有关。直接强制退出再尝试是很多人会做的,但更有效的是先排查具体原因。 检查设备资源与软件状态 导出视频是个高负载任务,容易因资源不足中断。 关闭后台应用:尤其是浏览器、游戏或其他大型程序,释放内存和处理器资源。 确认存储空间:确保手机或电脑有…

    2026年9月21日
    000
  • 苹果为何把Apple ID改名为Apple Account

    苹果公司宣布将“Apple ID”更名为“Apple Account”,这一变化迅速引发热议。虽然只是名称上的调整,但其背后蕴含着深远的战略考量。 体现服务边界的扩展 随着苹果生态系统日益庞大,原有的“ID”一词已难以全面涵盖用户通过该账户所使用的广泛功能。如今,这一个账户不仅用于设备激活和App …

    2026年9月21日
    200

发表回复

登录后才能评论
关注微信