树莓派用Python+OpenCV做人脸识别

硬件:树莓派 B+

先安装python-opencv:

 sudo apt-get install python-opencv

Python 2.7   OpenCV3.0



然后在树莓派usb端口插入一个通用的usb摄像头,看系统是否自动识别并已经安装驱动。

一般linux下免驱,如果没有驱动,可以更新update系统。


然后有两种方法检测摄像头是否被良好的正常驱动:

1. 在根目录下输入ls /dev,查看目录下是否存在video0这个设备。有则表示系统已识别。

2. 输入lsusb查看usb挂载设备;如下有1e4e那就是有摄像头了:



然后安装截图软件fswebcam进行摄像头测试,可配合web服务器实现图片监控;

 apt-get install fswebcam


为实现自动拍照,可新建脚本cam.sh并chmod +x设置权限到最大,让系统自动执行。


然后加入cronjob使该脚本每分钟自动运行一次。
Cron 是UNIX,SOLARIS,LINUX下的一个十分有用的工具。通过Cron脚本能使计划任务定期地在系统后台自动运行。这种计划任务在UNIX,SOLARIS, LINUX下术语为cron jobs。
“crontab -e” 指令表示,编辑该用户的crontab,当指定crontab 不存在时新建。

*/1 * * * * /home/pi/cam.sh

加入上述语句表示每分钟执行一次。然后保存crontab即可看到图像更新。


web端效果:



然后准备用MPEGStreamer发布流媒体视频到本地网页,供查看:

分以下几个步骤:

1。 安装mjpeg库:sudo apt-get install libv4l-dev libjpeg8-dev imagemagick


2。 使用SVN从SourceForge上编译MPEGStreamer这个开源项目:

或者直接下载整套代码压缩包mjpg-streamer_svn_r182.tar.gz,自行编译;


之后把压缩包复制到/home/pi目录下:

cp mjpg-streamer_svn_r182.tar.gz /home/pi

解压该压缩包,到mjpg-streamer目录下:

tar zxvf mjpg-streamer_svn_r182.tar.gz

软连接现在的libjpeg8版本的库到libjpeg7依赖:
ln -s /usr/include/libv4l1-videodev.h /usr/include/linux/videodev.h

最后进入源代码目录并编译:


编译完毕后即告成功!!!


功能测试,执行:
sudo ./mjpg_streamer -i “./input_uvc.so -d /dev/video0  -r 1280×720 -f 12” -o “./output_http.so -p 8090 -w ./www”
(-r后是分辨率参数,-f后面是帧率,请根据您的摄像头参数进行调整)




# -*- coding: utf-8 -*-
import cv2.cv as cv 
import cv2 
import numpy as np
from cv2 import VideoCapture 
from video import create_capture
from common import clock,draw_str

#cv.NamedWindow("W1", cv.CV_WINDOW_AUTOSIZE) 
cv2.namedWindow("W1")
#cv2.ResizeWindow("video", 600, 600)
capture = cv2.VideoCapture(0)
success,frame=capture.read() 
color=(0,0,255)
classfier = cv2.CascadeClassifier("/home/opencv/data/haarcascades/haarcascade_eye.xml")

def repeat():  
    succes,frame = capture.read()
    image_size =frame.shape[:2] 
    #print image_size
    image = np.zeros(image_size, dtype=np.float16)
    image = cv2.cvtColor(frame, cv2.cv.CV_BGR2GRAY)
    hi,wi=image_size
    minSize=(wi/8,hi/8)
    image=cv2.equalizeHist(image)
    #storage = cv2.CvMemStorage(0)
   # cv2.rectangle(frame, (210, 0), (210, 480),(0,0,255))  
    cv2.line(frame, (210,0),(210,480), (0,255,255),1) 
    cv2.line(frame, (420,0),(420,480), (0,255,255),1) 
    cv2.line(frame, (0,160),(640,160), (0,255,255),1) 
    cv2.line(frame, (0,320),(640,320), (0,255,255),1) 
   # detect objects 
   # faces = cv.HaarDetectObjects(image, cascade, storage, 1.2, 
   #   2,cv.CV_HAAR_DO_CANNY_PRUNING,(100, 100))
    faceRects = classfier.detectMultiScale(image, 1.2, 2,
      cv2.CASCADE_SCALE_IMAGE, minSize)

    for (x,y,w,h) in faceRects:
       # print x,y
        if x<210:
            print "right"
        elif x>310:
            print "left"
        cv2.rectangle(frame, (x,y), (x+w,y+h), (0,128,0))
    #    cv.ShowImage("W1", greyscale)
    #    cv.ShowImage("W1", frame)
    cv2.imshow("W1",frame)  
while True: 
    repeat() 
    c = cv2.waitKey(10) 
    c=chr(c & 255)
    if c in['q','Q',chr(27)]: 
        #cv2.VideoCapture(0).release() 
        cv2.destroyWindow("W1") 
        break

该例程可以识别眼睛,在眼睛部位画上绿色的小框框,并把人脸的转移方向输出在树莓派终端。

如果需要脸部识别,那就把haarcascade_eye.xml改成haarcascade_frontalface_alt.xml就可以了


附:人脸识别.py


#!/usr/bin/python
# -*- coding: UTF-8 -*-

# face_detect.py

# Face Detection using OpenCV. Based on sample code from:
# http://python.pastebin.com/m76db1d6b

# Usage: python face_detect.py <image_file>

import sys, os
from opencv.cv import *
from opencv.highgui import *
from PIL import Image, ImageDraw
from math import sqrt

def detectObjects(image):
    """Converts an image to grayscale and prints the locations of any faces found"""
    grayscale = cvCreateImage(cvSize(image.width, image.height), 8, 1)
    cvCvtColor(image, grayscale, CV_BGR2GRAY)

    storage = cvCreateMemStorage(0)
    cvClearMemStorage(storage)
    cvEqualizeHist(grayscale, grayscale)

    cascade = cvLoadHaarClassifierCascade(
        '/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml',
        cvSize(1,1))
    faces = cvHaarDetectObjects(grayscale, cascade, storage, 1.1, 2,
        CV_HAAR_DO_CANNY_PRUNING, cvSize(20,20))

    result = []
    for f in faces:
        result.append((f.x, f.y, f.x+f.width, f.y+f.height))

    return result

def grayscale(r, g, b):
    return int(r * .3 + g * .59 + b * .11)

def process(infile, outfile):

    image = cvLoadImage(infile);
    if image:
        faces = detectObjects(image)

    im = Image.open(infile)

    if faces:
        draw = ImageDraw.Draw(im)
        for f in faces:
            draw.rectangle(f, outline=(255, 0, 255))

        im.save(outfile, "JPEG", quality=100)
    else:
        print "Error: cannot detect faces on %s" % infile

if __name__ == "__main__":
    process('input.jpg', 'output.jpg')


  • 13
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值