[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的门锁系统
zbl 发表于 2017-12-11 15:11
这是国家要求的实名认证哈,首次发帖就会出现~
论坛里资源真多。。。。
貌似余生看不完的样子
如果论坛人气足够,是不是可以开一些课程啊?
最近各种课程都很流行的
这样也能对论坛资源更好的利用
我们小白也可以不用东抓一把西抓一把了
感谢管理大大回复。 flashyidea 发表于 2017-12-12 08:58
论坛里资源真多。。。。
貌似余生看不完的样子
如果论坛人气足够,是不是可以开一些课程啊?
社区的教程都是开源的啊,也有系列课程哦~~~希望社区能帮你树立终生学习的伟大志向{:5_180:} lauren 发表于 2017-10-20 01:43
牛了个毙了,python改变世界。不知道在LattePanda上还能跑些啥python强大的算法和功能? ...
哈哈,我再帮你去搜罗一下!:lol 很强大! 超级厉害了 请问一下,需要用到的硬件分别是什么,方便说一下吗?谢谢 牛了个毙了,python改变世界。不知道在LattePanda上还能跑些啥python强大的算法和功能? biubin4125 发表于 2017-10-19 23:57
请问一下,需要用到的硬件分别是什么,方便说一下吗?谢谢
硬件清单里有的哈~ 厉害厉害{:5_171:} 厉害,能介绍下学Python的网站么? 月色无声 发表于 2017-10-30 14:24
厉害,能介绍下学Python的网站么?
社区有micropython版块哈~
https://mc.dfrobot.com.cn/forum-157-1.html 我只欣赏。点个赞 python2.7能做不? 我想用树莓派做 按照教程做了一个,很好玩。脑袋歪着就识别不了啦。 我用罗技的usb摄像头可以,其他的杂牌usb摄像头不行。 学习学习吧
发个帖子就要认证。。。。。。 flashyidea 发表于 2017-12-11 10:53
发个帖子就要认证。。。。。。
这是国家要求的实名认证哈,首次发帖就会出现~ zbl 发表于 2017-10-20 10:11
硬件清单里有的哈~
1x罗技C170
1x伺服马达
1xLattePanda
页:
[1]
2