PCのカメラで顔検出するまで

毎年の授業のネタとしてOpenCVで顔検出(face detection)をさせているが、せっかくなのでROS経由で顔検出させることにした。

カメラの設定

まずは、ノートPCについているカメラを使えるようにする。参考にしたのはこちらのサイト。
ロボット作成日記「カメラ画像の表示 」
カメラによって使えるカメラドライバは変わるが、うちの環境ではros-groovy-camera-umdを導入するだけでよかった。この導入により、uvc_cameraのパッケージが利用可能となる。
sudo apt-get install ros-groovy-camera-umd

ちゃんと動作するかどうか、以下を起動して確認する。
rosrun uvc_camera camera_node
rosrun image_view image_view image:=/image_raw

前者でカメラノードを立ち上げ、後者でカメラ画像を表示している。なお、カメラからの画像は/image_rawトピックを通じて得ることができる。

OpenCVパッケージの導入

顔検出に必要なOpenCVのパッケージとして、 ros-groovy-mjpeg-server をインストールしておく。
sudo apt-get install ros-groovy-mjpeg-server

顔検出

顔検出には、OpenCVのHaar分類器を用いたpi_face_trackerというノードを使うことにする。他にもface_detectorがあるがステレオ画像を対象としているようなのでpi_face_trackerにした。ただし、ubuntuのパッケージにはなっていないのでビルドする必要がある。
説明の都合上、~/workspaceでROSのワークスペースが作られているものとする。
先ほどのページの指示に従い、SVNから最新のpi_visionのソースを取り込んでビルドする。
cd ~/workspace/
svn co http://pi-robot-ros-pkg.googlecode.com/svn/trunk/pi_vision
rosws set ~/workspace/pi_vision/
. ~/setup.sh
rosdep install pi_vision

rosdep installでは以下のようなエラーが表示されてしまう。
ERROR: the following packages/stacks could not have their rosdep keys resolved
to system dependencies:
pi_face_tracker_gui: Missing resource rosbridge
ROS path [0]=/opt/ros/groovy/share/ros
ROS path [1]=/home/itoh/workspace/pi_vision
ROS path [2]=/opt/ros/groovy/share
ROS path [3]=/opt/ros/groovy/stacks
ros2opencv: Missing resource uvc_cam
ROS path [0]=/opt/ros/groovy/share/ros
ROS path [1]=/home/itoh/workspace/pi_vision
ROS path [2]=/opt/ros/groovy/share
ROS path [3]=/opt/ros/groovy/stacks
pi_face_tracker: Missing resource uvc_cam
ROS path [0]=/opt/ros/groovy/share/ros
ROS path [1]=/home/itoh/workspace/pi_vision
ROS path [2]=/opt/ros/groovy/share
ROS path [3]=/opt/ros/groovy/stacks

pi_visionの使っているノードが見つからないというエラーなので、rosbridgeをrosbridge_server、uvc_camをuvc_cameraのように修正していく。
rosbridgeに関する修正は、pi_vision/pi_face_tracker_gui/manifest.xml に対して行う。下から4行目あたりのrosbridgeをrosbridge_serverに変更する。変更した後の内容は以下の通り。
<depend package="rosbridge_server"/>
uvc_camに関する修正は、pi_vision/ros2opencv/manifest.xmlとpi_vision/pi_face_tracker/manifest.xmlの2カ所に対して行う。どちらも、uvc_camをuvc_cameraに変更する。
<depend package="uvc_camera"/>
続いてrosmakeする。
rosmake pi_vision
この状態で起動することはできるのだが、uvc_cameraの画像トピック名が/image_rawであるのに対して、pi_face_trackerでは/camera/image_rawを使っている。そのため起動しても画面には何も表示されない。pi_vision/pi_face_tracker/launch/face_tracker_uvc_cam.launch の5行目にある/camera/image_rawを/image_rawに変更する。変更した後の内容は以下の通り。
<remap from="input_rgb_image" to="/image_raw" />
以上でビルドは完了。

使い方

roslaunch ros2opencv uvc_cam.launch
roslaunch pi_face_tracker face_tracker_uvc_cam.launch

uvc_cameraノードを起動しておき、face_trackerを起動する。
自動的にimage_viewが立ち上がり検出後の画像が表示される。
画面上でのショートカットキーは以下の通り。

  • q – 終了
  • c – 現在の特徴を削除する
  • t – テキスト表示のオン/オフ
  • f – 特徴表示のオン/オフ
  • n – ナイトモード(カメラ画像表示しない)のオン/オフ
  • a – 自動的な顔検出のオン/オフ