Raspberry Pi カメラモジュールで撮った画像をopencv_appsで顔認識してみる
前回までのところで、raspicam_node + opencv_appsをつかって画像処理をやってみた。今後、自作ロボットに顔認識をさせて何かしらのアクションをさせてみようかと思っているので、その前段階として今回はopencv_appsの顔認識を使ってみたいと思う。
実行環境
Raspberry Pi 4 Model B / 4GB
Ubuntu Server 20.04.5 LTS(64-bit)
ROS Noetic Ninjemys
Raspberry Pi カメラモジュール Rev1.3
raspicam_nodeを起動する
まず、以前と同じ手順でraspicam_nodeを起動する。opencv_appsで画像処理する場合はraspicam_nodeのraw画像を使う必要があるので、enable_raw:=trueオプションをつけてlaunchファイルを実行する。
roslaunch raspicam_node camerav1_1280x720.launch enable_raw:=true
opencv_appsのface_detection.launchを起動する
あとは前回のedge_detectionのデモと同じように、face_detection.launchのファイルを起動するだけ…なのだが、デフォルトのlaunchファイルだとエラーが出てうまく起動できなかった。それについては以下でも書いている。
そのため、ちょっと無理やりな方法ではあるが/opt/ros/noetic/share/opencv_apps/launchディレクトリに置いてあるface_detection.launchを
sudo vi face_detection.launch
で起動して、face_detection.launchの
<arg unless="$(arg use_opencv3)" name="face_cascade_name" default="/usr/share/opencv/haarcascades/haarcascade_frontalface_alt.xml" doc="Face dtection cascade Filename" /> <arg unless="$(arg use_opencv3)" name="eyes_cascade_name" default="/usr/share/opencv/haarcascades/haarcascade_eye_tree_eyeglasses.xml" doc="Eye dtection cascade Filename" />
のdefault=…のディレクトリを以下のようにopencvからopencv4に変更した。
<arg unless="$(arg use_opencv3)" name="face_cascade_name" default="/usr/share/opencv4/haarcascades/haarcascade_frontalface_alt.xml" doc="Face dtection cascade Filename" /> <arg unless="$(arg use_opencv3)" name="eyes_cascade_name" default="/usr/share/opencv4/haarcascades/haarcascade_eye_tree_eyeglasses.xml" doc="Eye dtection cascade Filename" />
この状態で
roslaunch opencv_apps face_detection.launch image:=/raspicam_node/image/
を実行すると、前回のエッジ検出と同様にウィンドウが開き、処理された画像が表示されている。この状態で、ラズパイのカメラの前に顔画像を置いてみると、以下のように顔に紫の丸が表示されて、顔画像を認識できていることがわかる。
また、貼った画像には表示されていないが、人物の目の位置も緑の丸で表示される。
なお、今回作った画像はphotoACのAI人物素材で生成した架空の人物のもの。photoACのAI人物素材は、アカウントがあれば1日50回までAIにより架空の人物の顔画像を生成してダウンロードすることができる↓
https://www.photo-ac.com/main/genface
ちょっと短いが今回はここまで。今後は自作ロボットに顔認識してそちらに動いていくような処理をさせたいと思っている。そのため、次回は前段階の勉強として、opencv_appsのnodeがPublishする顔の座標データを取得して、ログで表示するようなSubscriberのノードを作ってみたいと思う。
ROS勉強記まとめ
この勉強記は以下のページでまとめてます。