【ROS】opencv_appsのface_detection.launchを実行したらImage processing error: !empty() detectMultiScaleと出て実行できない

投稿日:2023年7月8日
最終更新日:2023年7月8日

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。


投稿者: wakky

映画と旅行が大好きなエンジニア。お酒、ゲーム、読書も好き。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください