opencv_appsで顔認識してみようとしたらエラーが発生
opencv_appsの顔認識を使ってみようと思って、ラズパイのカメラを起動している状態でface_detection.launchを実行してみたところ
[ERROR] [1678895587.587484804]: Image processing error: !empty() detectMultiScale ../modules/objdetect/src/cascadedetect.cpp 1689
のようにErrorが出て実行できなかった。今回はこの時にやったことをメモ。
実行環境
Raspberry Pi 4 Model B / 4GB
Ubuntu Server 20.04.5 LTS(64-bit)
ROS Noetic Ninjemys
Raspberry Pi カメラモジュール Rev1.3
launchファイルを書き換えたら動いた
結論から言うと、/opt/ros/noetic/share/opencv_apps/launchのディレクトリ(※私の環境だとopencv_appsをaptでインストールしたらデフォルトでこのディレクトリにインストールされていた)に置いてある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" />
ちなみに、デフォルトだと管理者権限がないと編集できないので、私はviを使って
sudo vi face_detection.launch
で起動して書き換えた。以下が実際にface_detection.launchが動いている様子。スマホに映した顔写真を認識して紫の丸がついていることがわかる。ちなみに顔写真はphotoACのAI人物素材で生成したもの。
ちなみにここに至るまでに試してみたことを以下にメモっておいたので、興味がある人はどうぞ。
調べてみたことのメモ
まず最初に出たエラーについて調べてみると、OpenCVで顔認識に必要なカスケードの定義ファイルのパスが誤っているときに出るエラーのようだ。
/opt/ros/noetic/share/opencv_apps/launchにおいてface_detection.launchファイルの中身を確認してみると、haarcascade_frontalface_alt.xmlとhaarcascade_eye_tree_eyeglasses.xmlという定義ファイルのディレクトリが指定されているのだが、OpenCVのVersionによってディレクトリが異なるようだ。
OpenCVはROSをインストール過程で勝手にインストールされておりversionがわからなかったので、findコマンドを使ってhaarcascade_frontalface_alt.xmlとhaarcascade_eye_tree_eyeglasses.xmlを検索してみたところ、/usr/share/opencv4/haarcascades/に置いてあった。OpenCV4がインストールされているらしい。
ということで、launchファイルにuse_opencv4オプションをつけて以下を実行してみた。
roslaunch opencv_apps edge_detection.launch image:=/raspicam_node/image/ use_opencv4:=true
しかし、今度は以下のようなエラーが発生。
RLException: Invalid <arg> tag: arg 'face_cascade_name' has already been declared. Arg xml is <arg unless="$(arg use_opencv3)" name="face_cascade_name" default="/usr/share/opencv/haarcascades/haarcascade_frontalface_alt.xml" doc="Face dtection cascade Filename"/> The traceback for the exception was written to the log file
face_cascade_nameが既に定義されているといことでエラーが出ているらしい。たしかにlaunchファイルをよく見ると、use_opencv4:=trueにしても、そのあとの <arg unless=”$(arg use_opencv3)”の条件でもう一度定義されてしまうような…。
ちょっと使い方の正解がよくわからないので、もうlaunchファイル書き換えちゃえ、ということでlaunchファイルを書き換えるという方法に行きついた。launchファイルをいじるのが嫌だったら、face_detection.launchをコピーして書き換えて実行してもOK。