开发环境win10(64位)
开发语言Labview2019(64位)+python3.6(64位)
数据库是ACCESS2010,另外在64位系统上想要访问ACCESS需要下载安装64位数据库引擎:https://www.microsoft.com/zh-CN/download/details.aspx?id=13255
Labview需要单独安装的模块是VAS:视觉采集软件,可以在NI官网下载离线包。
python用到的模块有opencv-python,numpy,pypyodbc,dlib(dlib在windows系统下的安装方式,请自行百度,建议采用离线安装)。
设计思路:Labview搭建可视化界面,主要实现采集图像,保存图像,保存图像对应的姓名、工号等信息到数据库;
python主要实现图像中人脸特征向量的提取、以及特征向量的保存和特征向量的欧式距离的计算(也就是识别新图像中的人脸是谁)
注意:本项目为个人项目,目前只在win10(64位)系统上验证,其他环境可否尚待感兴趣的小伙伴们验证(但我觉得win7(64位)应该没问题);另外,Labview2019支持python2.7和3.6版本的调用,其他版本会出现不可知的错误,同时要注意Labview64位必须和python64位使用,不能调用python32位。同时,我在电脑上安装labview2019的32位版本也不能调用32位版本的python3.6(一脸懵逼)。
今天先说一下Labview部分,明天再说python部分,python部分没啥说的,网上现成的资源有的是,主要在于Labview调用。
主界面展示一下:(请忽略本人)
线程一:摄像头采集图像——这个线程一直循环工作(没有考虑过合不合理,那不是我的水平能达到的)
线程二:四个事件——拍照、保存图像、训练人脸特征向量、人脸识别
需要VAS模块,借用的是自带例程。
循环采集图像也没啥可说的。
首先,开启摄像头(所有语言都是这个样子),因为我调用的是USB摄像头(或者电脑自带摄像头),所以使用IMAXdx Open Camera.vi,然后创建一个IMAXdx类的属性节点,然后为这个属性节点设定一些参数,图中没有注释的两个参数是相关的,就是为了设置相机留出多少缓存为之后的数据提供空间。HardwareRequeueBufferListThreshold就是一个默认的关键词,它告诉相机我要设定一个阈值,你按照我设定的阈值给我留出空间来,然后设定了一个50,就是让相机给留出50%的缓存。
然后,Configure Grab.vi设置一下缓存区的大小,能够改变采集速率;同时创建IMAQ,相当于cv2.namedWindow()。
接着,开启一个while循环,在循环内部不断获取图像,同时判断图像是否更新,如果更新就将新图像替换原有图像;
最后,退出循环后要将IMAQdx关闭,清除设置,释放摄像头,关闭所有窗口(这不就是release()和destroyAllWindows()么)
事件“拍照”:
imgage_data控件和“看看”控件属性是不一样的(请注意)
事件“保存”
首先调用了一个子vi,用来登记拍照者的一些信息,并将其保存到数据库中;然后,当接收到以上信息登记完成后,将图片保存到指定文件夹中,这里可以不开启对话框,直接保存。
(“信息.vi”中就是和access数据库通讯的东西,人员信息你们就自己想吧,我设置的是名字,部门和工号,将工号作为唯一标识识别人脸,同时支持同一人多次存入人脸,可以提高识别的准确性;人脸图片也和自动追加编号,比如你的工号为110,第一次存入人脸,先读数据库有没有你的工号,没有就将你的图片命名为110_0.png;如果有你的信息,就去读取你有多少条记录,假如你以保存了5次,那就将再次保存的图像命名为110_5)
事件“特征训练”
调用了Feature.py脚本。三个输入参数,都是字符串类型,一个输出变量——bool类型
事件“人脸识别”:
这里要用到IMAQdx Get Image Data.vi,它可以将图像直接转换为一维数组;然后我先调用了一个”人脸识别.vi“的子vi,如下
在这个子vi中,我再次调用了一个Face_recognition.py的脚本,输入参数是图像的一维数组(uint8),和人脸特征向量文件路径(字符串);输出就是工号(字符串)。
以上就是labview部分,明天有时间再写python部分的。晚安