设为首页收藏本站

[应用教程] [LattePanda]搭配OpenCV的人脸识别机器人

zbl 发表于 2017-10-19 16:02:25 | 显示全部楼层 [复制链接]
11 964
作者/摄影   袁佑缘

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

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


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

2.png

请在安装Python时,将下方Add Python 3.6 to PATH勾选起来,意思是要把Python加入windows操作系统的环境变量内。
3.png

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

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

接下来请输入exit()跳出这个Python互动界面,回到windows的命令提示字符。
7.png

接下来请输入pip install numpy,使用Python的套件管理员pip来安装numpy这个套件。
8.png

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

9.png
最后请输入pip install pyserial,安装在python中用来做Serial沟通的pyserial套件。
10.png

准备Python IDE
撰写Python的程序除了要打code之外,还需要执行的环境,所以笔者在这边推荐一款非常容易上手的PythonIDE,请到以下的网站(http://thonny.org/)下载并安装Thonny
11.png

装完必要的Python套件之后,我们就要来把Thonny的程序路径设定成我们计算机系统中默认的Python执行程序。请点选Tools然后再点选Options,进入Thonny的偏好设定。如下图。
12.png

接下来选择interpreter,也就是Python的直译器为系统默认的路径,如下图。
13.png

2.硬件架设

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

3.软件实作

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

[AppleScript] 纯文本查看 复制代码
#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!");
    }
}


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了,如果说读者想要尝试其他的分辨率,请记得也要修改镜头追踪的中线喔!

[AppleScript] 纯文本查看 复制代码
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()

相关阅读:


发表于 2017-10-19 21:07:54 | 显示全部楼层
很强大!
回复 支持 反对

使用道具 举报

发表于 2017-10-19 22:38:31 | 显示全部楼层
超级厉害了
回复 支持 反对

使用道具 举报

发表于 2017-10-19 23:57:50 | 显示全部楼层
请问一下,需要用到的硬件分别是什么,方便说一下吗?谢谢
回复 支持 反对

使用道具 举报

发表于 2017-10-20 01:43:30 | 显示全部楼层
牛了个毙了,python改变世界。不知道在LattePanda上还能跑些啥python强大的算法和功能?
回复 支持 反对

使用道具 举报

发表于 2017-10-20 10:11:28 | 显示全部楼层
biubin4125 发表于 2017-10-19 23:57
请问一下,需要用到的硬件分别是什么,方便说一下吗?谢谢

硬件清单里有的哈~
回复 支持 反对

使用道具 举报

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

哈哈,我再帮你去搜罗一下!
回复 支持 反对

使用道具 举报

发表于 2017-10-20 20:53:36 | 显示全部楼层
厉害厉害
回复 支持 反对

使用道具 举报

发表于 2017-10-30 14:24:39 | 显示全部楼层
厉害,能介绍下学Python的网站么?
回复 支持 反对

使用道具 举报

发表于 2017-10-31 15:40:07 | 显示全部楼层
月色无声 发表于 2017-10-30 14:24
厉害,能介绍下学Python的网站么?

社区有micropython版块哈~
http://www.dfrobot.com.cn/community/forum-157-1.html
回复 支持 反对

使用道具 举报

发表于 2017-11-2 04:07:30 | 显示全部楼层
我只欣赏。点个赞
回复 支持 反对

使用道具 举报

发表于 2017-11-7 22:34:53 | 显示全部楼层
python2.7能做不?
回复 支持 反对

使用道具 举报

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

本版积分规则 允许回帖同步到新浪微博  

推荐阅读

精华导读




公司简介| 联系我们| 小黑屋| 加入我们| 微博| 优酷| 英文网站| DF创客社区 ( 沪ICP备09038501号-4  
友情链接| 硬创邦| 花生壳社区| 模友之吧| 电子发烧友社区| 创客星球| 云汉电子社区| 电子工程网| 与非网| Arduino中文社区| 南极熊3D打印网| OneNET|

上海智位机器人有限公司  沪ICP备09038501号-4   

Powered by Discuz! X3.1

Licensed Comsenz Inc.

返回顶部 返回列表