2017-10-19 16:02:25 [显示全部楼层]
27876浏览
查看: 27876|回复: 23

[LattePanda]搭配OpenCV的人脸识别机器人

[复制链接]
作者/摄影   袁佑缘

本文说明如何使用LattePanda搭配 python语言去使用OpenCV机器视觉函式库来打造一个人脸辨识机器人,本范例的操作环境将以LattePandaWindows10为主。

时间         1小时
难度       * *
材料表   LattePanda,屏幕,键盘,鼠标,Webcam


1. 软件准备
安装Python与相关套件
首先请到Python的网站下载最新版的安装档,在这边要提醒一下Python目前有两种版本,一个是2.7x版,另一个3.x版。Python 2.7x版是比较旧的版本,同时官方也有发出声明将不会在继续更新了,而本篇的范例使用的是新版3.x的Python,所以请注意一下不要选错啰,以本文为例,最新的版本是3.6.1,如下图。接着请按照以下步骤进行。

[LattePanda]搭配OpenCV的人脸识别机器人图2

请在安装Python时,将下方Add Python 3.6 to PATH勾选起来,意思是要把Python加入windows操作系统的环境变量内。
[LattePanda]搭配OpenCV的人脸识别机器人图3

安装完成后,为了测试我们的计算机是否能正常呼叫Python,请呼叫您计算机的终端机,windows的用户请按下快捷键win+R便会在左下角显示执行窗口,接着输入cmd,这样一来就会叫出windows的命令提示字符。
[LattePanda]搭配OpenCV的人脸识别机器人图4
[LattePanda]搭配OpenCV的人脸识别机器人图5

接下来请在上面输入Python,呼叫Python的互动界面,如果能成功看到>>>的符号,那就代表已经成功叫起Python的界面了,而使用者可以直接在上面输入Python的相关指令,如果没有正确显示这个界面的话,可能是您前面的安装过程有问题,请重新回到前面的安装步骤,有可能是您没有勾选系统变量那个选项,所以windows无从呼叫Python
[LattePanda]搭配OpenCV的人脸识别机器人图6

接下来请输入exit()跳出这个Python互动界面,回到windows的命令提示字符。
[LattePanda]搭配OpenCV的人脸识别机器人图7

接下来请输入pip install numpy,使用Python的套件管理员pip来安装numpy这个套件。
[LattePanda]搭配OpenCV的人脸识别机器人图8

装完numpy之后,一样使用pip来安装OpenCV套件,请输入pip install opencv-python

[LattePanda]搭配OpenCV的人脸识别机器人图9
最后请输入pip install pyserial,安装在python中用来做Serial沟通的pyserial套件。
[LattePanda]搭配OpenCV的人脸识别机器人图10

准备Python IDE
撰写Python的程序除了要打code之外,还需要执行的环境,所以笔者在这边推荐一款非常容易上手的PythonIDE,请到以下的网站(https://thonny.org/)下载并安装Thonny
[LattePanda]搭配OpenCV的人脸识别机器人图11

装完必要的Python套件之后,我们就要来把Thonny的程序路径设定成我们计算机系统中默认的Python执行程序。请点选Tools然后再点选Options,进入Thonny的偏好设定。如下图。
[LattePanda]搭配OpenCV的人脸识别机器人图12

接下来选择interpreter,也就是Python的直译器为系统默认的路径,如下图。
[LattePanda]搭配OpenCV的人脸识别机器人图13

2.硬件架设

本范例使用罗技C170webcam作为辨识人脸的摄影镜头,另外为了要能够追踪人脸的位置,我们还需要架设一个旋转平台,如下图,由底下的小型伺服马达(MG90)来控制镜头对到的方位。且注意到下方的小马达控制讯号线是接到LattePanda左边的3Pin接头,记得靠外侧是要接深色的地线喔!
[LattePanda]搭配OpenCV的人脸识别机器人图1

3.软件实作

Arduino程序代码
为了要控制旋转平台的伺服马达,我们需要使用LattePanda上的Arduino Leonardo芯片,请打开Arduino IDE并打上以下的程序代码,并上传到LattePanda上的Arduino端(请记得选对COM port)。
Arduino端的控制动作其实很简单,它会听取Serial传来的字符命令,如果是小写的字母a或b就会分别左右旋转一度,进而达到转动镜头的效果,而伺服马达的控制讯号脚位在本范例中用的是9号脚位,接法如上图,如果想接其他脚位请记得要改一下Arduino程序代码里的脚位定义(s.attach(9))。

[mw_shl_code=applescript,true]#include <Servo.h>

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)
                degree = 0;
            s.write(degree);
        }
        else
            Serial.println("Press a/b to turn the camrea!");
    }
}[/mw_shl_code]


Python 程序代码

前面已经准备好Python会需要用到的函式库跟IDE了,接下来我们就要来实作最后关键的人脸辨识以及追踪,因为需要用到辨识人脸的模型,请去OpenCV的github网站(https://github.com/opencv/opencv/tree/master/data/haarcascades)下载 haarcascade_frontalface_default.xml与haarcascade_eye.xml这两个.xml档,分别是用来辨识人的脸部与以及眼睛。

程序代码的实做可以拆解成几个重要的部份,以下就让我们一步一步的来了解吧!

首先我们会由cv2.VideoCapture(0)来读取Webcam的影像信息,并且设定初始的分辨率是640×480,接下来在端口COM5建立一个Serial信道,用来下指令给Arduino端,以控制镜头的方向。

而while循环里面则包含了主要的辨识程序,辨识的方法其实很简单,就是先把镜头每一帧的照片先灰阶化,再透过前面下载的脸部及眼部辨识模块套进去(face_cascde和eye_cascade)去做最可能的人脸侦测(这里使用的方法是取最大/近的脸部面积)。

最后为了要追踪人脸,我们需要计算出人脸的中心位置(position = x + w/2.0),x是标示人脸方框的 角落x坐标,w则是宽度,所以取一半的宽度就会得到人中的x坐标位置,接下来我们只要跟我们取的影像中线做比较,然后左右旋转镜头去做追踪即可,而这调中线的位置则可以从前面设定的分辨率640×480来算出,取宽的一半就能得到范例程序中的320了,如果说读者想要尝试其他的分辨率,请记得也要修改镜头追踪的中线喔!

[mw_shl_code=applescript,true]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('COM5', 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()[/mw_shl_code]

相关阅读:


flashyidea  高级技师

发表于 2017-12-12 08:58:35

zbl 发表于 2017-12-11 15:11
这是国家要求的实名认证哈,首次发帖就会出现~

论坛里资源真多。。。。
貌似余生看不完的样子
如果论坛人气足够,是不是可以开一些课程啊?
最近各种课程都很流行的
这样也能对论坛资源更好的利用
我们小白也可以不用东抓一把西抓一把了

感谢管理大大回复。
回复

使用道具 举报

zbl  中级技匠
 楼主|

发表于 2017-12-12 10:25:31

flashyidea 发表于 2017-12-12 08:58
论坛里资源真多。。。。
貌似余生看不完的样子
如果论坛人气足够,是不是可以开一些课程啊?

社区的教程都是开源的啊,也有系列课程哦~~~希望社区能帮你树立终生学习的伟大志向
回复

使用道具 举报

zbl  中级技匠
 楼主|

发表于 2017-10-20 10:11:53

lauren 发表于 2017-10-20 01:43
牛了个毙了,python改变世界。不知道在LattePanda上还能跑些啥python强大的算法和功能? ...

哈哈,我再帮你去搜罗一下!:lol
回复

使用道具 举报

lkl0305  中级技师

发表于 2017-10-19 21:07:54

很强大!
回复

使用道具 举报

hnyzcj  版主

发表于 2017-10-19 22:38:31

超级厉害了
回复

使用道具 举报

biubin4125  初级技师

发表于 2017-10-19 23:57:50

请问一下,需要用到的硬件分别是什么,方便说一下吗?谢谢
回复

使用道具 举报

lauren  高级技师

发表于 2017-10-20 01:43:30

牛了个毙了,python改变世界。不知道在LattePanda上还能跑些啥python强大的算法和功能?
回复

使用道具 举报

zbl  中级技匠
 楼主|

发表于 2017-10-20 10:11:28

biubin4125 发表于 2017-10-19 23:57
请问一下,需要用到的硬件分别是什么,方便说一下吗?谢谢

硬件清单里有的哈~
回复

使用道具 举报

1973742214  高级技师

发表于 2017-10-20 20:53:36

厉害厉害
回复

使用道具 举报

月色无声  初级技师

发表于 2017-10-30 14:24:39

厉害,能介绍下学Python的网站么?
回复

使用道具 举报

zbl  中级技匠
 楼主|

发表于 2017-10-31 15:40:07

月色无声 发表于 2017-10-30 14:24
厉害,能介绍下学Python的网站么?

社区有micropython版块哈~
https://mc.dfrobot.com.cn/forum-157-1.html
回复

使用道具 举报

xiaobudian  见习技师

发表于 2017-11-2 04:07:30

我只欣赏。点个赞
回复

使用道具 举报

super-power  中级技师

发表于 2017-11-7 22:34:53

python2.7能做不?
回复

使用道具 举报

好奇吖斌  高级技师

发表于 2017-11-21 20:13:16

我想用树莓派做
回复

使用道具 举报

super-power  中级技师

发表于 2017-11-21 21:16:24

按照教程做了一个,很好玩。脑袋歪着就识别不了啦。
回复

使用道具 举报

super-power  中级技师

发表于 2017-11-22 17:26:05

我用罗技的usb摄像头可以,其他的杂牌usb摄像头不行。
回复

使用道具 举报

ldsgrh  见习技师

发表于 2017-12-1 17:45:13

学习学习吧
回复

使用道具 举报

flashyidea  高级技师

发表于 2017-12-11 10:53:20

发个帖子就要认证。。。。。。
回复

使用道具 举报

zbl  中级技匠
 楼主|

发表于 2017-12-11 15:11:28

flashyidea 发表于 2017-12-11 10:53
发个帖子就要认证。。。。。。

这是国家要求的实名认证哈,首次发帖就会出现~
回复

使用道具 举报

zsz  见习技师

发表于 2018-8-3 20:57:22

zbl 发表于 2017-10-20 10:11
硬件清单里有的哈~

1x罗技C170
1x伺服马达
1xLattePanda
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail