ラズベリーパイのカメラモジュールからストリーミング配信をし、 それをラズパイ内にインストールした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
とやれば、ラズベリーパイでウィンドウが立ち上がり、 そこでカメラのストリーミングが流れ、 顔を発見した場合に、顔に四角く枠が表示されるはずです。
参考
下記サイト様の情報を参考にさせていただきました。ありがとうございます。