ラズベリーパイのカメラモジュールからストリーミング配信をし、 それをラズパイ内にインストールしたopencv 3.1.0 + python 2.7で受け取り、 顔認証をするまで行いましたので、まとめます。

環境

RASPBERRY PI 3 MODEL B + RASPBIAN JESSIE
opencv 3.1.0
python 2.7

下準備

$ sudo apt-get update
$ sudo apt-get upgrade

opencvのインストール

こちらは過去の記事を参照してください。 Raspberry Pi 3 Model B + Raspbian Jessie環境にOpenCv3.1.0をインストール

カメラの設定

ラズパイの設定を開いて、カメラモジュールをenableにする。

$ sudo raspi-config

ライブラリのインストール

$ sudo apt-get install python-picamera

顔認識のためのxmlを取得

$ wget https://github.com/opencv/opencv/raw/master/data/haarcascades/haarcascade_frontalface_default.xml

pythonコードを作成

2017.11.30 追記 - start pythonコードの改良版をgithubで公開しました。 https://github.com/face-authentication/camera_module

うち、カメラ操作の部分はこちらになります。 https://github.com/face-authentication/camera_module/blob/master/src/modules/pycamera.py

2017.11.30 追記 - end

とりあえず動けばいい的なノリで書いたコードで申し訳ございませんが、

from picamera.array import PiRGBArray
from picamera import PiCamera
import sys, os
import time
import cv2

# initialize the camera and grab a reference to the raw camera capture
camera = PiCamera()
camera.resolution = (640, 480)
camera.framerate = 32
rawCapture = PiRGBArray(camera, size=(640, 480))

cascPath = sys.argv[1]
faceCascade = cv2.CascadeClassifier(cascPath)

# allow the camera to warmup
time.sleep(0.1)

# capture frames from the camera
for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
    # grab the raw NumPy array representing the image, then initialize the timestamp
    # and occupied/unoccupied text
    image = frame.array

    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    faces = faceCascade.detectMultiScale(
        gray,
        scaleFactor=1.1,
        minNeighbors=5,
        minSize=(30, 30),
        flags=cv2.CASCADE_SCALE_IMAGE
    )

    # Draw a rectangle around the faces
    for (x, y, w, h) in faces:
        cv2.rectangle( image, (x, y), (x+w, y+h), (0, 255, 0), 2)

    # show the frame
    cv2.imshow("Frame", image)
    key = cv2.waitKey(1) & 0xFF

    # clear the stream in preparation for the next frame
    rawCapture.truncate(0)

    # if the `q` key was pressed, break from the loop
    if key == ord("q"):
        break

仮に上のコードをstreaming.pyと名前をつけたとして、

$ python streaming.py haarcascade_frontalface_default.xml

とやれば、ラズベリーパイでウィンドウが立ち上がり、 そこでカメラのストリーミングが流れ、 顔を発見した場合に、顔に四角く枠が表示されるはずです。

参考

下記サイト様の情報を参考にさせていただきました。ありがとうございます。