zbl 发表于 2017-10-19 16:02:25

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

原文链接作者/摄影   袁佑缘
本文说明如何使用LattePanda搭配 python语言去使用OpenCV机器视觉函式库来打造一个人脸辨识机器人,本范例的操作环境将以LattePanda的Windows10为主。
时间         1小时难度       * *材料表   LattePanda,屏幕,键盘,鼠标,Webcam

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


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

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


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

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

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

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

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

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

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

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

2.硬件架设

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

3.软件实作

Arduino程序代码为了要控制旋转平台的伺服马达,我们需要使用LattePanda上的Arduino Leonardo芯片,请打开Arduino IDE并打上以下的程序代码,并上传到LattePanda上的Arduino端(请记得选对COM port)。Arduino端的控制动作其实很简单,它会听取Serial传来的字符命令,如果是小写的字母a或b就会分别左右旋转一度,进而达到转动镜头的效果,而伺服马达的控制讯号脚位在本范例中用的是9号脚位,接法如上图,如果想接其他脚位请记得要改一下Arduino程序代码里的脚位定义(s.attach(9))。
#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了,如果说读者想要尝试其他的分辨率,请记得也要修改镜头追踪的中线喔!
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*face)
      cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
      roi_gray = gray
      roi_color = img
      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()
相关阅读: 使用C# 来做蓝牙4.0 iBeacon的门锁系统

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
论坛里资源真多。。。。
貌似余生看不完的样子
如果论坛人气足够,是不是可以开一些课程啊?


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

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

厉害厉害{:5_171:}

月色无声 发表于 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
页: [1] 2
查看完整版本: [LattePanda]搭配OpenCV的人脸识别机器人