Contents
はじめに
以前まで組み立てていたSG90サーボカメラマウントとラズパイカメラモジュールを使って
顔追跡=オートトラッキングが出来るカメラを作ります。
参考サイト
今回参考にしたサイトは数知れません。。たくさんのサイトを参考にさせていただきました。
そもそもopencvの知識0から開始してるので当たり前ですね。
特に参考にさせていただいたのはこちらのサイト様です。
OpenCVのチュートリアルです。驚くほどわかりやすいです。先にこちらを見ておくと理解が早まると思います。
そもそものコードなどはPonDad様のこちらのサイトのものを使わせていただきました。
さらに9680lhqv様の詳しい解説のおかげで理解が深まりました。
回路図、構成図
前回のサーボと同じです。前回の投稿を参照してください。
準備
この後に出てくるコードですが、ラズパイのカメラモジュールの場合はbcm2835-v4l2というモジュールを呼び出す必要があるようです。
こちらのサイト様を参考にさせていただきました。
このモジュールなしで実行させると以下のようなエラーが出ました。
モジュールを入れたあとは出てきません。
1 2 3 4 5 6 7 |
(cv-python3) one3@raspberrypi:~/testsg90 $ python3 70test.py W,H,fps: 0.0 0.0 0.0 OpenCV Error: Assertion failed (size.width>0 && size.height>0) in imshow, file /home/one3/opencv-3.1.0/modules/highgui/src/window.cpp, line 281 Traceback (most recent call last): File "70test.py", line 85, in <module> cv2.imshow("Show FLAME Image", frame) cv2.error: /home/one3/opencv-3.1.0/modules/highgui/src/window.cpp:281: error: (-215) size.width>0 && size.height>0 in function imshow |
流れとしては
・lsmod | grep bcm2835_v4l2
bcm2835_v4l2がないことを確認。ハイフンではなくアンダーバーでした。
・sudo apt-get update
・sudo apt-get upgrade
・sudo apt-get install libv4l-dev
私の環境では既にlibv4l-devがありました。
・sudo modprobe bcm2835-v4l2
読み込むのはハイフンのほう。
・lsmod | grep bcm2835_v4l2
bcm2835_v4l2があることを確認。
以上でカメラモジュールでも動作できます。永続的に読み込むならsudo vim /etc/modulesで
bcm2835-v4l2
と書き足せばOKです。こっちはハイフンです。
書いた後に再起動すればlsmodでbcm2835_v4l2が表示されるはずです。
pythonコード
OpenCVはこちらでインストールしたものを使ってます。
pythonのバージョンは3.5.3、OpenCVのバージョンは3.1.0で動作させました。
コード内のコメントは自分の確認用に書いてます。間違ってたらすいません。。
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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
# -*- coding: UTF-8 -*- import cv2 import os import time import pigpio pi = pigpio.pi() #x_move:range720-2370 #y_move:range1000-2315 def move(x_move, y_move): #print('x_move: ', x_move) #print('y_move: ', y_move) pi.set_servo_pulsewidth(4, x_move) pi.set_servo_pulsewidth(17, y_move) #X,Yのサーボで稼働させる範囲。適当によさげな範囲を選んだ X_MAX = 2370 X_MIN = 720 X_HOME = 1545 Y_MAX = 2300 Y_MIN = 1000 Y_HOME = 1650 #カメラの位置初期化 #pi.set_servo_pulsewidth(4, 1545) #pi.set_servo_pulsewidth(17, 1650) move(X_HOME, Y_HOME) #パス注意 cascade_path = "/home/one3/opencv-3.1.0/data/haarcascades/haarcascade_frontalface_alt.xml" cascade = cv2.CascadeClassifier(cascade_path) cap = cv2.VideoCapture(0) # FRAME_WIDTH W = cap.get(cv2.CAP_PROP_FRAME_WIDTH) # FRAME_HEIGHT H = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) # fps fps = cap.get(cv2.CAP_PROP_FPS) #デフォルトの画面サイズとfpsを確認 print('W,H,fps: ', W , H , fps) #W,H,fps: 640.0 480.0 30.0 cap.set(3, 320) #横サイズ320 cap.set(4, 320) #縦サイズ320 cap.set(5, 15) #fps color = (255, 255, 255) #白色 #初期位置 now_degree_x, now_degree_y, move_degree_x, move_degree_y = X_HOME, Y_HOME, 0, 0 while(True): ret, frame = cap.read() facerect = cascade.detectMultiScale(frame, scaleFactor=1.2, minNeighbors=2, minSize=(10, 10)) for rect in facerect: img_x = rect[0]+rect[2]/2 img_y = rect[1]+rect[3]/2 #print(img_x, img_y) #カメラをどれだけ動かすか。320/2で160。0.1箇所を大きくするとカメラが大 きく動く move_degree_x = now_degree_x - (img_x-160)*0.1 move_degree_y = now_degree_y + (img_y-160)*0.1 #print('deg: ', move_degree_x , move_degree_y) #実際にカメラを動かすところ move(move_degree_x, move_degree_y) now_degree_x = move_degree_x now_degree_y = move_degree_y #顔認証した中心点を円で描写 cv2.circle(frame, (int(img_x), int(img_y)), 10, color, -1) #顔認証した部分を長方形で囲む cv2.rectangle(frame, tuple(rect[0:2]),tuple(rect[0:2] + rect[2:4]), color, thickness=3) cv2.imshow("Show FLAME Image", frame) k = cv2.waitKey(1) if k == ord('q'): break cap.release() cv2.destroyAllWindows() |
カメラの画面サイズとfpsがデフォルトだと640*480の30fpsとなります。
私が動作させたときはこれだと「もっさり」というか重いので、
320*320の15fpsにしています。
それでも参考サイト様と比べると重いような・・・
カメラモジュールのせいかしら?
Xlib: extension "RANDR" missing on display ":1.0".について
tightvncserverのVNC経由で起動させてます。
SSH経由だと画像が出力できずエラーとなります。
ただtightvncserverでも上記エラーメッセージが発生します。
調べてみるとtightvncserverではなくX11vncだと発生しないとのことで。。
こちらのサイト様に従ってX11vncを試してみました。
またraspi-configで3 Boot Options⇒B1 Desktop / CLI→B4 Desktop Autologinを実行しGUIでログインするように変更しました。
その結果、エラーメッセージはでなくなりました。
が、エラーメッセージ出ても問題なく動いており、tightvncserverを愛用しているので、
今はエラーメッセージを無視してtightvncserverを使ってます。
動作について
動作について大雑把に説明すると
顔を検出する
↓
その方向に少しずつカメラを移動させる。
これだけです。
顔追跡ですが自分の顔を晒すのは恥ずかしいので、家にある試供用のパンパース使ってカメラに顔を追跡させます。ちなみにうちはパンパース派です。
実際に動作している映像がこちらです。
動作はゆっくりですが少しずつカメラがパンパースを追いかけているのがわかります。
最後に
とうとう顔追跡=オートトラッキングまでこれました!
偉人の力を借りてるだけですが、すごいことが出来る世の中になりましたね。。
この投稿書いてるときに矩形(くけい)という言葉を生まれて初めて知ったわー。たんけいだと思ってたわー。
次回は少しおまけの内容です。
おまけではなくなりました。。
コメント
[…] Raspberry Pi 3とカメラモジュールで顔追跡カメラを作る […]
[…] いろいろインターネットをあちらこちらしましたが,このサイトを主に参考にしました. (参考:Raspberry Pi3 […]
[…] Raspberry Pi 3とカメラモジュールで顔追跡カメラを作る […]