树莓派上使用python实现人脸识别

  1. 首先配置树莓派摄像头模块
    插入摄像头排线

    sudo raspi-config

进入配置
选中Interfacing Options ,进入并使能camera
可参考这里
如果是USB摄像头
可以参考一下
然后就可以操作摄像头了

  • 拍照指令

    raspistill -o keychain.jpg -t 2000

2000ms后 拍一张照,存在当前目录,名字叫keychain.jpg

  • 拍视频

想要用摄像头模块拍一段视频的话,可以从命令行运行 raspivid 工具。下面这句命令会按照默认配置(长度5秒,分辨率1920x1080,比特率 17Mbps)拍摄一段视频。

 raspivid -o mykeychain.h264

如果你想改变拍摄时长,只要通过 “-t” 选项来设置你想要的长度就行了(单位是毫秒)。

raspivid -o mykeychain.h264 -t 10000

其它操作可以参考这里

  1. 安装opencv
    sudo apt-get install python-opencv
    安装后可以输入以下代码验证安装
    python -c 'import cv2; print dir(cv2)'
    会出现许多库

  2. 为opencv配置摄像头
    opencv无法识别树莓派原装摄像头则输入

    sudo nano /etc/modules
    添加一行:

    bcm2835-v4l2
    参考这里

  3. 识别人脸
    代码可参考这里
    可以识别并框住人脸,如果摄像头打不开请按2来
    先下载训练好的人脸特征文件haarcascade_frontalface_default.xml(普通人脸特征)
    可以到https://github.com/opencv/opencv/tree/master/data/haarcascades找到并下载
    下载方式可以参考在github上下载单个文件
    将下载的haarcascade_frontalface_default.xml文件与程序放在同一目录
    下面是代码 在用命令行运行python时后面须加参数0,例如

python test_camer.py 0

0为python程序的第二个参数

> #-*- coding: utf-8 -*- import cv2 import sys import time from PIL import Image
> 
> def CatchUsbVideo(window_name, camera_idx):
>     cv2.namedWindow(window_name)
>     #视频来源,可以来自一段已存好的视频,也可以直接来自USB摄像头
>     cap = cv2.VideoCapture(camera_idx)
>     #告诉OpenCV使用人脸识别分类器 保存在程序目录
>     classfier = cv2.CascadeClassifier(r'./haarcascade_frontalface_default.xml')
>     #识别出人脸后要画的边框的颜色,RGB格式
>     color = (0, 255, 0)
>     while cap.isOpened():
>         ok, frame = cap.read() #读取一帧数据
>         if not ok:            
>             break  
>         #将当前帧转换成灰度图像
>         grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)                 
>         #人脸检测,1.2和2分别为图片缩放比例和需要检测的有效点数
>         faceRects = classfier.detectMultiScale(grey, scaleFactor = 1.2, minNeighbors = 3, minSize = (32, 32))
>         if len(faceRects) > 0:            #大于0则检测到人脸                                   
>             for faceRect in faceRects:  #单独框出每一张人脸
>                 x, y, w, h = faceRect        
>                 cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2)
>         #显示图像
>         cv2.imshow(window_name, frame)        
>         c = cv2.waitKey(10)#按q退出
>         if c & 0xFF == ord('q'):
>             break        
>     #释放摄像头并销毁所有窗口
>     cap.release()
>     cv2.destroyAllWindows()  if __name__ == '__main__':
>     if len(sys.argv) != 2:
>         print("Usage:%s camera_id\r\n" % (sys.argv[0]))
>     else:
>         CatchUsbVideo("识别人脸区域", int(sys.argv[1]))

使用此程序缺点就是帧率太低

faceRects = classfier.detectMultiScale(grey, scaleFactor = 1.2, minNeighbors = 3, minSize = (32, 32))

参数解释,可参考opencv人脸检测–detectMultiScale函数

最后如果运行程序却看不到窗口或者窗口闪退,是因为树莓派自带摄像头需要设置一下

sudo nano /etc/modules-load.d/rpi-camera.conf 打开摄像头配置文件。
在最后添加一行bcm2835-v4l2,保存重启,至此opencv就可以读取树莓派自带的摄像头了。
参考这里树莓派3B+使用Opencv读取自带摄像头

你可能感兴趣的:(树莓派,python)