×

使用DFRobot LattePanda进行OpenCV人脸识别

消耗积分:2 | 格式:zip | 大小:1.05 MB | 2022-10-28

其实znvm

分享资料个

描述

介绍

在本文中,我们将介绍如何使用 Python 编程语言中的 OpenCV 库在 LattePanda 上实现人脸识别。

我们使用的操作系统是 LattePanda 上默认的 Windows 10。

1. 软件准备

安装 Python

首先,请从官网下载最新的Python注意Python有两个版本,一个是2.7.x版本,一个是3.x版本。2.7.x 版本是较旧的版本,将来会被弃用,所以在这个项目中我们使用 Python3,本文中的最新版本是3.6.1

请按照下图安装。

 
pYYBAGNY0S-AGImkAAG4oESpYos912.png
 

安装 Python 时不要忘记勾选“ Add Python 3.6 to PATH ”选项,它使 Windows 系统能够调用 Python 可执行文件。

 
pYYBAGNY0TGAUk7pAAB3tSsNiHM805.png
 

安装后,为了测试我们是否可以在 LattePanda 上运行 Python,请按快捷键“Win+R”启动命令提示符并输入“ cmd ”。

 
poYBAGNY0TSAacR0AABOzQb_BzI704.png
 

接下来,在 cmd 中键入“ python ”以启动 Python 交互会话。如果出现符号“ >>> ”,则表示 Python 已成功安装并在您的操作系统上运行。否则,如果您看到任何错误消息,请检查安装步骤,尤其是PATH选项。

 
poYBAGNY0TaAcwjsAAAvA968v04391.png
 

请输入“ exit() ”命令退出此shell并返回命令提示符。

 
poYBAGNY0TyAXMgyAAA9qeTJpHU409.png
 

安装所需的软件包

现在,我们将使用Python 包管理器(pip)安装这个项目的三个必要的 Python 包

1. 请在命令提示符下输入“ pip install numpy ”安装此Python数值计算工具。

 
pYYBAGNY0T-AByJAAAA0E2U9SAs314.png
 

2.接下来,输入“ pip install opencv-python ”来安装OpenCV,一个开源的计算机视觉库,我们在我们的项目中使用它来识别人脸。

 
poYBAGNY0UGABpabAABdw3Y11no496.png
 

3、最后输入“ pip install pyserial ”安装Python的串口通讯工具。我们使用这个库与 Python 和 Arduino 建立串行连接。

 
poYBAGNY0USAbGHVAAA0PccUsqs777.png
 

Thonny - Python IDE

人们可能需要一些工具来有效地编写代码。这是我们向您推荐的一个名为Thonny的优秀 Python IDE 该 IDE 集成了适合初学者的所有基本工具(调试器、python shell、变量等)。

您可以从官方网站下载它:.

 
pYYBAGNY0UeAYvFMAAEezViA1TI764.png
 

为了让 Thonny 使用之前安装的 Python 包,我们需要将解释器的默认路径更改为 Windows 系统中 Python 可执行文件的位置。

在 thonny IDE 中,单击工具,然后单击选项以打开首选项窗口:

 
poYBAGNY0UyADT-9AADUu8rAKmc978.png
 

在这个窗口中,点击interpreter选项卡,将路径设置为默认的Python安装路径,如下图:

 
poYBAGNY0U6AK2NRAAER-yfuebI464.png
 

2.硬件

我们在这个项目中使用Logitech C270 网络摄像头(或几乎任何其他带有 USB 连接器的网络摄像头)来识别人脸。而要跟踪人脸位置,我们需要一个小的旋转平台。如下图所示,我们使用底部的小型伺服电机(Tower Pro MG90)来旋转安装在其上的相机。您可以在Thingiverse 网站上查看现成的网络摄像头/伺服支架

请注意,伺服信号线连接到LattePanda 上的Arduino 引脚 9 。确保正确连接,棕色接地针朝外,如 LattePanda 上标记的那样。

 
pYYBAGNY0VqAe5lzAAbPt3ugO_0026.png
 

三、软件实现

阿杜诺素描

请启动 Arduino IDE 并将以下代码下载到 LattePanda 的 Arduino Leonardo 内核(您必须指定正确的 COM 端口,通常是COM4 )。

在这段代码中,LattePanda 的 Arduino 芯片会从串口接收到两条不同的指令,如果指令是“ a ”或“ b ”,则将相机 CCW 或 CW 转动 1 度(此值可根据你的要求)。

由于我们已将伺服连接到 LattePanda Arduino D9引脚,当然我们必须在您的 Arduino 草图(第 9 行)中指定它。如果要将伺服切换到另一个引脚,请记住将“ s.attach(9) ”这一行中的引脚号修改为实际引脚号。伺服上限 (180) 和伺服下限 (0) 可以根据物理设置进行修改。

//Arduino sketch
//waiting command from LattePanda (Python) to control servo
#include 
Servo s;
int degree = 90;
void setup()
{
    Serial.begin(115200);
    s.attach(9);
}
void loop()
{
    if(Serial.available())
    {
        int cmd = Serial.read();
        if(cmd == 'a')
        {
            degree++;
            if(degree >= 180)
                degree = 180;
            s.write(degree);
        }
        else if(cmd == 'b')
        {
            degree--;
            if(degree <= 0)   //lower
                degree = 0;
            s.write(degree);
        }
        else
            Serial.println("Press a/b to turn the camrea!");
    }
}

Python 脚本

我们已经准备好了 Python 库和 IDE,现在让我们完成人脸跟踪的实现。

由于我们要在这个项目中检测人脸,请从OpenCV github(https://github.com/opencv/opencv/tree/master/data/haarcascades)下载现有模型,我们需要两个xml文件:

  • haarcascade_frontalface_default.xml :用于人脸检测
  • haarcascade_eye.xml :用于眼睛检测。

首先,我们将调用函数“ cv2.VideoCapture(0) ”从分辨率为 640x480 的相机中检索图像数据。接下来,我们构建串行连接(第 9中的COM4 )与 Arduino 内核通信,并使用它来控制伺服角度。

while循环中的识别功能就是简单地将每一帧中的原始图像转换为灰度颜色,然后使用识别模型(face_cascade和eye_cascade)在这一帧中找到最可能的人脸。

如何确定我们想要的脸?该程序将计算图像中有多少张脸并选择最大的一张

为了跟踪人脸,程序首先计算人脸的位置(第22行中的position = x + w/2.0 ),x是标记人脸的矩形的左上角坐标,w是矩形的宽度.

LattePanda 得到人脸位置后,将其与图像中心(#24~27 行)进行比较,并发出命令旋转相机平台以补偿差异。

注意,我们已经指定中心线为320 (由 640/2 导出,640 是每个图像帧的分辨率宽度)。所以如果你想修改分辨率或者使用另一个网络摄像头,不要忘记改变这个参数。

import cv2
import numpy as np
import serial
face_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('./haarcascade_eye.xml')
cap = cv2.VideoCapture(0)
cap.set(3, 640)
cap.set(4, 480)
ser = serial.Serial('COM4', 115200)
while True:
    _, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 2, 5)
    if len(faces):
        (x, y, w, h) = max(faces, key=lambda face: face[2]*face[3])
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
        roi_gray = gray[y:y+h, x:x+w]
        roi_color = img[y:y+h, x:x+w]
        eyes = eye_cascade.detectMultiScale(roi_gray)
        for (ex,ey,ew,eh) in eyes:
            cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
        position = x + w/2.0
        print(position)
        if position < 320:
            ser.write(b'a')
        else:
            ser.write(b'b')
        
    cv2.imshow('face', img)
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break
cv2.destroyAllWindows()

演示视频

检查这个项目的性能,我们在手机上显示一张人脸图片,你可以看到网络摄像头会尝试将其中心对准人脸。欣赏~

 

 

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.lene-v.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'使用DFRobot LattePanda进行OpenCV人脸识别',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.lene-v.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);