树莓派学习(三)基于OpenCv的人脸识别

博主的课程设计选题,开始在网上参考了诸多教程踩了很多坑最终得以实现,所以写下心得总结,以便后人乘凉~
https://blog.csdn.net/kyokozan/article/details/79192646
https://blog.csdn.net/LC_1994/article/details/52971408
https://blog.csdn.net/coolwriter/article/details/77825375
https://blog.csdn.net/leaves_joe/article/details/67656340
http://shumeipai.nxez.com/2017/03/16/raspberry-pi-face-recognition-system.html
https://courses.cit.cornell.edu/ece5990/ECE5990_Fall15_FinalProjects/Andre_Heil/ece5990_final_report/avh34_jr986.html
https://www.cnblogs.com/Pyrokine/p/8921285.html

以上是我主要参考的几个帖子,感谢前辈们~~
安装OpenCV的最佳方式是 照 Adrian Rosebrock 的教程来进行:《Raspbian Stretch: Install OpenCV 3 + Python on your Raspberry Pi》
(https://www.pyimagesearch.com/2017/09/04/raspbian-stretch-install-opencv-3-python-on-your-raspberry-pi/)
来进行,不过如果仅限于实现简单的人脸识别有一部分东西并不需要安装
另外,推荐使用交叉编译进行,博主在树莓派3B+上编译整整用了近4小时,很痛苦
另外,注意 树莓派摄像头模块(PiCam)千万不能热插拔,很容易烧坏
另外,你可能需要搭个梯子,或者更换apt源
下面开始:
首先安装OpenCV及其依赖的各种工具和图像视频库:
打开终端
 
  

扩大TF卡的空间,如果不做这步操作,后面会出问题,比如卡死

sudo raspi-config

sudo apt -get update
sudo apt
-get upgrade 

// 安装build-essential、cmake、git和pkg-config
sudo apt
-get install build-essential cmake git pkg-config
// 安装jpeg格式图像工具包
sudo apt
-get install libjpeg8-dev
// 安装tif格式图像工具包
sudo apt
-get install libtiff5-dev
// 安装JPEG-2000图像工具包
sudo apt
-get install libjasper-dev
// 安装png图像工具包
sudo apt
-get install libpng12-dev 
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev

安装gtk2.0(树莓派很可能下载错误,更换中科大或者清华源即可):

sudo apt-get install libgtk2.0-dev
sudo apt-get install libatlas-base-dev gfortran

执行到这里就把OpenCV的依赖包全部安装好了,之后要开始编译OpenCV源代码了,请大家用wget工具下载到用户目录下(源码要放在有执行权限的位置,不是安装位置),命令如下:
// 使用wget下载OpenCV源码,觉得慢的话可以到https://github.com/opencv/opencv/releases下载OpenCV的源代码
(tar.gz格式,需要解压好)放到用户目录下,但是OpenCV_contrib请大家使用wget,亲测直接到Github下载zip文件的话, 会有编译问题

// 下载OpenCV
wget -O opencv-
3.4.1.zip https://github.com/Itseez/opencv/archive/3.4.1.zip
// 解压OpenCV
unzip opencv-
3.4.1.zip
// 下载OpenCV_contrib库:
wget -O opencv_contrib-
3.4.1.zip https://github.com/Itseez/opencv_contrib/archive/3.4.1.zip
// 解压OpenCV_contrib库:
unzip opencv_contrib-
3.4.1.zip

找到你下载的源码文件夹并打开,tar.gz解压后文件夹名应该是opencv-3.4.1(版本号可能会变化),git方式下载的文件夹名应该是opencv。



// 打开源码文件夹
cd opencv-3.4.1

之后我们新建一个名为release的文件夹用来存放cmake编译时产生的临时文件:


// 新建 release文件夹
mkdir release
// 进入 release文件夹
cd release

设置cmake编译参数,安装目录默认为/usr/local ,注意参数名、等号和参数值之间不能有空格,但每行末尾“\”之前有空格,参数值最后是两个英文的点:

// CMAKE_BUILD_TYPE是编译方式,CMAKE_INSTALL_PREFIX是安装目录,OPENCV_EXTRA_MODULES_PATH是加载额外模块,INSTALL_PYTHON_EXAMPLES是安装官方python例程,BUILD_EXAMPLES是编译例程(这两个可以不加,不加编译稍微快一点点,想要C语言的例程的话,在最后一行前加参数INSTALL_C_EXAMPLES=ON \)

sudo cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.4.1/modules \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D BUILD_EXAMPLES=ON ..

注意  -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.4.1/modules \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D BUILD_EXAMPLES=ON ..
       这三个都可以不安装

之后开始正式编译过程
// 编译,以管理员身份,否则容易出错
sudo make
// 安装
sudo make install
// 更新动态链接库
sudo ldconfig

整个编译过程大约4小时,做好心理准备!推荐在Ubuntu下进行交叉编译,半小时左右!


// 安装
sudo make install
// 更新动态链接库
sudo ldconfig
到这里,OpenCV的编译完成

安装PiCamera
1
2
3
sudo apt-get install python-pip
sudo apt-get install python-dev
sudo pip install picamera

至此人脸识别所需要的准备工作已经完成,

下是人脸识别代码
from picamera.array import PiRGBArray
from picamera import PiCamera
from functools import partial
 
import multiprocessing as mp
import cv2
import os
import time
 
 
### Setup #####################################################################
 
os.putenv( 'SDL_FBDEV', '/dev/fb0' )
 
resX = 320
resY = 240
 
cx = resX / 2
cy = resY / 2
 
os.system( "echo 0=150 > /dev/servoblaster" )
os.system( "echo 1=150 > /dev/servoblaster" )
 
xdeg = 150
ydeg = 150
 
 
# Setup the camera
camera = PiCamera()
camera.resolution = ( resX, resY )
camera.framerate = 60
 
# Use this as our output
rawCapture = PiRGBArray( camera, size=( resX, resY ) )
 
# The face cascade file to be used
face_cascade = cv2.CascadeClassifier('/home/pi/opencv-2.4.9/data/lbpcascades/lbpcascade_frontalface.xml')
 
t_start = time.time()
fps = 0
 
 
### Helper Functions ##########################################################
 
def get_faces( img ):
 
    gray = cv2.cvtColor( img, cv2.COLOR_BGR2GRAY )
    faces = face_cascade.detectMultiScale( gray )
 
    return faces, img
 
def draw_frame( img, faces ):
 
    global xdeg
    global ydeg
    global fps
    global time_t
 
    # Draw a rectangle around every face
    for ( x, y, w, h ) in faces:
 
        cv2.rectangle( img, ( x, y ),( x + w, y + h ), ( 200, 255, 0 ), 2 )
        cv2.putText(img, "Face No." + str( len( faces ) ), ( x, y ), cv2.FONT_HERSHEY_SIMPLEX, 0.5, ( 0, 0, 255 ), 2 )
 
        tx = x + w/2
        ty = y + h/2
 
        if   ( cx - tx > 15 and xdeg <= 190 ):
            xdeg += 1
            os.system( "echo 0=" + str( xdeg ) + " > /dev/servoblaster" )
        elif ( cx - tx < -15 and xdeg >= 110 ):
            xdeg -= 1
            os.system( "echo 0=" + str( xdeg ) + " > /dev/servoblaster" )
 
        if   ( cy - ty > 15 and ydeg >= 110 ):
            ydeg -= 1
            os.system( "echo 1=" + str( ydeg ) + " > /dev/servoblaster" )
        elif ( cy - ty < -15 and ydeg <= 190 ):
            ydeg += 1
            os.system( "echo 1=" + str( ydeg ) + " > /dev/servoblaster" )
 
    # Calculate and show the FPS
    fps = fps + 1
    sfps = fps / (time.time() - t_start)
    cv2.putText(img, "FPS : " + str( int( sfps ) ), ( 10, 10 ), cv2.FONT_HERSHEY_SIMPLEX, 0.5, ( 0, 0, 255 ), 2 ) 
 
    cv2.imshow( "Frame", img )
    cv2.waitKey( 1 )
 
 
### Main ######################################################################
 
if __name__ == '__main__':
 
    pool = mp.Pool( processes=4 )
    fcount = 0
 
    camera.capture( rawCapture, format="bgr" )  
 
    r1 = pool.apply_async( get_faces, [ rawCapture.array ] )    
    r2 = pool.apply_async( get_faces, [ rawCapture.array ] )    
    r3 = pool.apply_async( get_faces, [ rawCapture.array ] )    
    r4 = pool.apply_async( get_faces, [ rawCapture.array ] )    
 
    f1, i1 = r1.get()
    f2, i2 = r2.get()
    f3, i3 = r3.get()
    f4, i4 = r4.get()
 
    rawCapture.truncate( 0 )    
 
    for frame in camera.capture_continuous( rawCapture, format="bgr", use_video_port=True ):
        image = frame.array
 
        if   fcount == 1:
            r1 = pool.apply_async( get_faces, [ image ] )
            f2, i2 = r2.get()
            draw_frame( i2, f2 )
 
        elif fcount == 2:
            r2 = pool.apply_async( get_faces, [ image ] )
            f3, i3 = r3.get()
            draw_frame( i3, f3 )
 
        elif fcount == 3:
            r3 = pool.apply_async( get_faces, [ image ] )
            f4, i4 = r4.get()
            draw_frame( i4, f4 )
 
        elif fcount == 4:
            r4 = pool.apply_async( get_faces, [ image ] )
            f1, i1 = r1.get()
            draw_frame( i1, f1 )
 
            fcount = 0
 
        fcount += 1
 
        rawCapture.truncate( 0 )
保存为.py文件直接在树莓派图形界面下打开执行

  
  
  



  • 19
    点赞
  • 171
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
树莓派是一款基于Linux系统的迷你计算机,可以通过Python编程语言进行编程。树莓派编程指南是一本详细介绍如何在树莓派上使用Python进行编程的指南。 树莓派Python编程指南首先介绍了树莓派的基本知识,包括硬件组成、操作系统安装等。然后,通过具体的实例,介绍了Python编程语言的基本语法和常用库的使用。 树莓派Python编程指南涵盖了多个主题,包括GPIO控制、电子项目、摄像头、网络通信等。其中,GPIO控制是树莓派的一个重要功能,通过编程控制GPIO口可以实现对外接电子器件的控制,如LED灯、温度传感器等。另外,树莓派的摄像头模块也提供了Python编程接口,可以通过编程实现拍照、录像等功能。此外,树莓派还可以通过网络通信与其他设备进行数据传输,Python编程指南也详细介绍了网络通信的相关知识。 树莓派Python编程指南在介绍这些知识点时,使用了丰富的实例和代码,充分展示了Python编程在树莓派上的应用。同时,指南还提供了练习题和项目实践建议,帮助读者巩固所学知识,并激发创造力和实践能力。 总之,树莓派Python编程指南是一本系统性、实用性强的编程指南,适用于树莓派初学者和Python编程爱好者。阅读本指南,读者可以了解树莓派的基础知识,学习Python编程语言,并通过实际操作掌握树莓派编程的技能。不仅如此,本指南还能激发读者的创造力,帮助他们开展各种有趣的项目。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值