# iSeeU **Repository Path**: eyiyluo_081/iSeeU ## Basic Information - **Project Name**: iSeeU - **Description**: No description available - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 0 - **Created**: 2018-12-14 - **Last Updated**: 2021-06-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 时间:2018.12.13 # 程序功能: 1、默认界面点击“识别”按钮,可对当前拍摄到的图像进行人脸识别,并显示识别结果 2、点击“模式切换”按钮,切换到信息录入模式 3、在信息录入模式下,输入代表队和姓名后,点“拍照”按钮,可提取当前拍到的人脸特征。特征记录到npy文件,原图保存下来 # 实现思路: 1、使用tkinter作为UI库。 2、UI主程序启动后,主线程负责图形界面刷新和操作响应,所有业务逻辑均以线程的方式实现。这样在进行耗时的功能运算时也不会在界面上停顿。 3、设置一个“模式切换”按钮用于在“识别模式”和“信息录入模式”间进行切换 4、拍照按钮根据当前所处的模式进行“识别”或“信息录入”操作 5、“代表队”和“姓名”在识别模式下用于显示识别出的信息。信息录入模式下用于输入所对应的信息 # 类的初始化: 1、初始化窗体,并设置其参数 2、初始化一些全局变量 3、初始化界面布局 4、初始化摄像头 5、调用 start_core_thread 方法启动“视频显示”和“图片显示”线程 # 界面布局: 1、左右各放1个frame,左边的frame用于放置显示视频的控件,右边的frame放置信息显示和操作控件 2、程序逻辑上,先把一层层的frame布放好,然后再按“从左到右,从上到下”的顺序逐个定义frame上摆放的各个控件 # 识别模式下“拍摄”按钮的实现逻辑: 1、使2个按钮失效 2、生成执行“start_recognizer”方法的线程,由线程去执行识别操作,执行完后恢复按钮。 # 信息录入模式下“拍摄”按钮的实现逻辑: 1、获取输入框内容并去除首位空格 2、判断代表队和姓名两项是否有其中一项为空 3、如果均不为空,则判断根据代表队和姓名所构成的npy文件是否已存在。文件名格式为:“代表队-姓名.npy”, 4、同时生成将要保存的图片文件的文件名,格式为:"代表队-姓名.jpg" 5、使2个按钮失效后发送信号 6、生成执行“handle_picture”方法的线程,由线程去执行图片处理操作 # 人脸识别线程“start_recognizer”的实现逻辑: 1、线程启动后若信号被激活,把当前帧缩小一半后另存为需处理图片 2、BGR转换为RGB格式 3、计算需处理帧中有多少个人脸 4、如果人脸数大于1,调用recognizer类的getMaxFaceFingerprint方法,获得帧里最大人脸的“脸纹” 5、根据获得的“脸纹”,调用searchSimilarPlayer方法遍历比对已载入的人脸脸纹信息。 6、若相似度大于阀值在log控件中显示代表队和姓名,并根据代表队和姓名,把存在目录中的照片换为ImageTk格式的图片,放入图片显示队列。由“图片显示”线程显示出来 7、5秒后,把默认图片放入图片显示队列。由“图片显示”线程显示出来 8、若相似度小于阀值,则在log控件中显示识别失败字样 9、恢复2个按钮为可用 # 图片处理线程“handle_picture”的实现逻辑: 1、线程启动后若信号被激活,先获取摄像头当前的原始帧,另存为需处理帧,以这个需处理帧作为后续识别处理的基准 2、需处理帧缩小到原始大小的一半 3、因为用CV2捕获的图片是BGR格式的,所以把BGR转换为RGB 4、计算需处理帧中有多少个人脸 5、如果人脸数大于1,调用recognizer类的getMaxFaceFingerprint方法,获得帧里最大人脸的“脸纹” 6、把“脸纹”保持到npy文件,把需处理帧保存为jpg文件 7、把需处理帧转换为ImageTk格式的图片,放入图片显示队列。由“图片显示”线程显示出来 8、5秒后,把默认图片放入图片显示队列。由“图片显示”线程显示出来 # label控件显示实时视频“video_loop”的实现逻辑 1、用cv2.cvtColor方法将BGR格式图片转换为RGB格式 2、用Image.fromarray方法转换为PIL适用的格式 3、用ImageTk.PhotoImage方法转换为tkinter适用的格式 4、把tkinter适用的格式让label显示 5、用self.root.after(1, self.video_loop)方法做循环,处理并显示下一帧。