27876| 23
|
[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的程序除了要打code之外,还需要执行的环境,所以笔者在这边推荐一款非常容易上手的PythonIDE,请到以下的网站(https://thonny.org/)下载并安装Thonny。 装完必要的Python套件之后,我们就要来把Thonny的程序路径设定成我们计算机系统中默认的Python执行程序。请点选Tools然后再点选Options,进入Thonny的偏好设定。如下图。 接下来选择interpreter,也就是Python的直译器为系统默认的路径,如下图。 本范例使用罗技C170的webcam作为辨识人脸的摄影镜头,另外为了要能够追踪人脸的位置,我们还需要架设一个旋转平台,如下图,由底下的小型伺服马达(MG90)来控制镜头对到的方位。且注意到下方的小马达控制讯号线是接到LattePanda左边的3Pin接头,记得靠外侧是要接深色的地线喔! 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会需要用到的函式库跟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] 相关阅读: |
zbl 发表于 2017-12-11 15:11 论坛里资源真多。。。。 貌似余生看不完的样子 如果论坛人气足够,是不是可以开一些课程啊? 最近各种课程都很流行的 这样也能对论坛资源更好的利用 我们小白也可以不用东抓一把西抓一把了 感谢管理大大回复。 |
月色无声 发表于 2017-10-30 14:24 社区有micropython版块哈~ https://mc.dfrobot.com.cn/forum-157-1.html |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed