使用OpenCV和Arduino的人脸跟踪器
文件列表(压缩包大小 287.46K)
免费
概述
使用OpenCV的面部识别功能跟踪人脸。
组件和耗材 Arduino UNO ×1个 USB相机 ×1个 SG90微型伺服电机 ×2 跳线(通用) ×8 面包板(通用) ×1个
关于这个项目 面部识别是一种非常有用的工具,已集成在许多现代设备中,用于检测人脸以进行跟踪,生物识别并识别人的活动。在这个项目中,我使用了OpenCV的Harr级联分类器来检测人脸,并使用Arduino UNO进行平移/倾斜伺服机制来跟踪用户的面部。
如何运作? 面部检测可识别和定位人脸并忽略任何背景对象,例如窗帘,窗户,树木等。OpenCV使用Harr分类器级联,其中视频的每一帧都经过分类器的各个阶段,如果该帧通过所有分类器,存在面部,否则将帧从分类器中丢弃,即未检测到面部。
OpenCV返回检测到的图像的笛卡尔坐标以及高度和宽度。根据这些坐标,可以使用x + width / 2和y + height / 2计算图像的中心坐标。
当检测到人脸时,这些坐标将使用pyserial库传递给Arduino UNO。连接到Arduino的伺服器提供了一个平移/倾斜机制,相机连接到其中一个伺服器。当脸部的坐标远离中心时,则伺服器将对齐2度(递增或递减)以使其朝向屏幕的中心。
侦测脸部 我使用了“haarcascade_frontalface_default.xml” ,它是用于检测人脸的经过预先训练的模型,可以从GitHub(这里)下载。
用于面部检测的功能cv2.CascadeClassifier.detectMultiScale()
的“比例因子”值为1.1(默认值),“最小邻域”值为6。这将返回图像的笛卡尔坐标以及高度和宽度。增加“ minNeighbour”(最小邻域)可以改善面部检测,但是会牺牲执行速度,这会导致来自伺服器的延迟响应。因此,这似乎是最佳的。
为了获得精确的面部识别,建议使用纯净的背景,因为由于背景中的窗帘,我面临一些错误的检测。
计算坐标 OpenCV返回以像素值表示的面部坐标。默认情况下,视频分辨率设置为640 * 480。坐标描述了左上像素值(x和y)以及高度和宽度。我已将面部的中心坐标用作参考,可以使用x + width / 2和y + height / 2进行计算,并且可以将其视为绿点。这些坐标被发送到arduino,以移动相机的角度。
框架中心的正方形以白色表示区域,该区域是面部中心(即绿点)必须位于的区域。如果在移动脸部时它位于方形区域之外,则伺服器将对齐相机以将其带入该区域内。
将串行数据发送到Arduino 当我尝试了多种方法将坐标顺序发送到arduino时,我发现此部分具有挑战性,但响应速度很慢。在花了几个小时弄清楚之后,我开始在线寻找类似的项目,直到找到这个项目(在这里)。这让我意识到了Serial函数Serial.parseInt(),该函数从传入的字节序列中获取整数输入(在此处检查)。我发送串行数据的方法类似于该项目中使用的方法。
python在单个字符串中发送中心坐标。例如:“ X100Y200”,X后面的值100表示中心x坐标,值200表示中心y坐标。
伺服安装 我已经将水平移动伺服器安装在装有相机的垂直移动伺服器的轴上。所有附件均使用简单的橡皮筋制作(我不推荐使用,因为我使用的是在家中已有的材料)。
由于我使用2个伺服器进行跟踪,因此建议向Arduino提供额外的9V电源(通过适配器),为两个伺服器提供足够的电流。在没有它的情况下,我注意到它们中存在某种振动而不会使其移动。
如果遇到文件不能下载或其他产品问题,请添加管理员微信:ligongku001,并备注:产品反馈
评论(0)