ラズパイいっぱい夢いっぱい! カメラを取り付けてOpenCVで顔検出をやってみた。
左側から、Type A, B, B+, 2です。
我ながら、何を考えてこんなに買ったんだろうか(^_^;)
参照サイト
http://blog.livedoor.jp/tmako123-programming/archives/41353891.html
OpenCVというIntelが開発・公開しているフリーの画像解析ライブラリ
http://ja.wikipedia.org/wiki/OpenCV
apt-getだと古いバージョンになるというので「新しい酒は新しい革袋に盛れ」との故事に従って、最新版ソースを取得。
raspi2でコンパイルしたが、参照サイトだと10時間かかると書いてあったので一晩放置。
※たぶんB+とかの話で、raspi2では3時間くらいで終わったかな?
インストールを終えて、サンプルコードを実行してみるとエラー!
(img:2465): Gtk-WARNING **: cannot open display:
どうやらSSH経由だったり、VNC Viewer経由だったせいか、カメラで撮った画像をウィンドウ表示するのに失敗しているらしい。
HDMI経由で直接モニタに接続したら、無事表示された。
とりあえず、jpgファイルに保存するように改造した。
※プライバー保護のためにモザイクをかけています。ダイエットしないとな…。
一応、ちゃんと顔検出は出来ているけど、理想はリアルタイムで個人識別して欲しいよな~。
実際のサンプルコード(python)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
import io import picamera import cv2 import numpy as np # 正面の顔の情報データ cascade_path = "/usr/share/opencv/haarcascades/haarcascade_frontalface_alt.xml" cascade = cv2.CascadeClassifier(cascade_path) stream = io.BytesIO() #カメラの解像度を設定 CAMERA_WIDTH = 320 CAMERA_HEIGHT = 240 # color = (255,255,255) camera = picamera.PiCamera() camera.resolution = (CAMERA_WIDTH, CAMERA_HEIGHT) #カメラで何回写真を取るかのループ for i in xrange(5): # 写真を撮る! camera.capture(stream, format='jpeg') data = np.fromstring(stream.getvalue(), dtype=np.uint8) image = cv2.imdecode(data, 1) #エラーになるのでコメントアウト(ウィンドウに表示) # cv2.imshow('image',image) # cv2.waitKey(16) # 解析しやすくするために灰色にする image_gray = cv2.cvtColor(image, cv2.cv.CV_BGR2GRAY) # ライブラリに顔検出してもらう facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1)) image_output = image # 顔が1つ以上あったら if len(facerect) > 0: # 顔検出した部分を、四角で囲む for rect in facerect: cv2.rectangle(image_output, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), color, thickness=2) # print "found" #エラーになるのでコメントアウト(ウィンドウに表示) # cv2.imshow('image_out',image_output) # cv2.waitKey(16) # jpgファイルに保存 cv2.imwrite(str(i) + '.jpg', image) # 写真領域をクリア(コレをしないと、ずっと同じ写真になる) stream.seek(0) print "captured %d" % (i) |