find_object_2dを用いた物体認識

目的

前回の講義で扱ったARタグ認識は,とても簡単かつ高精度にARタグを検出,さらには位置及び姿勢を認識できるとても便利なパッケージです.しかしながら,物体にARタグを貼ることができない場合には利用することができません.このような場合には,一般環境下で撮影した画像から認識したい物体を見つけるという処理が必要です.今回はfind_object_2dパッケージ[1]を使用し,画像から所望の物体を検出します.

find_object_2dを用いた物体認識

find_object_2dパッケージでは,カメラで撮影した画像(入力画像)から予め用意した画像(テンプレート画像)を見つけることができる便利なパッケージです.検出アルゴリズムは,入力画像及びテンプレート画像から注目画素周辺の領域に多くの濃淡情報を持つ特徴点を検出し,特徴点周辺の領域から濃淡情報を数十から数百次元のベクトルとして数値化した記述子を抽出します.そして,2枚の画像から計算した記述子の類似度を求めることで特徴点を対応づけます.これにより,入力画像中のどこに,どのぐらいの大きさでテンプレート画像が存在するかを認識できます.また,特長として画像の回転やスケール変化に不変,照明変化等にも頑健です.SIFT[2]に代表されるような特徴点の検出や記述の方法はSURF,FAST,BRIEF等がありますが,find_object_2dパッケージでは画像処理ライブラリであるopencv[3]に実装されているアルゴリズムを利用しています.

それでは,find_object_2dを利用して画像認識を行います.まずはfind_object_2dパッケージをインストールします.

$ sudo apt install ros-noetic-find-object-2d

インストールできたらカメラで画像を取得しましょう.

$ rosrun usb_cam usb_cam_node

次に,find_object_2dパッケージのノードを起動します.こちらのノードでは画像データを/imageという名前で購読する必要があるため,ノードを起動する際にトピック名を変更します.

$ rosrun find_object_2d find_object_2d image:=/usb_cam/image_raw

上記を実行するとウィンドウが立ち上がり,入力画像及び検出した特徴点を黄色の点で可視化した結果が表示されます.テンプレート画像を登録してみましょう.ウィンドウの左の領域(Objectメニュー)を右クリックしてください.「Add object from scene…」と「Add object from files…」の2つが表示されますので,ここでは「~ scene…」を選択する前提で説明します.もう一つウィンドウが起動するので,認識したい対象物が撮影された状態で「Take picture」をクリックしてください.次に,認識したい対象物の領域を登録します.対象物の全体を囲うようにドラッグし,「Next」をクリックします.ドラッグした領域が拡大されて表示されますので,問題ないようならば「End」をクリックします.これでテンプレート画像の登録は完了です.対象物体を検出すると色付きの枠で囲われます.対象物体を動かしたり,回転させてもある程度は検出できますので試してみましょう.

上記は一般的なカメラで実行しましたが,Kinectのような距離画像が取得できるカメラを利用することで,対象物体の位置及び姿勢を推定することが可能です.対象物体の位置及び姿勢の情報はtfによって出力されます.もし試したい方は下記の動画を参考にしてください.

参考文献
  1. find_object_2d package.
  2. SIFT Keypoint Detector.
  3. opencv, 2D Features framework.