安価で高画質・高機能なステレオカメラで人気のOAK-Dカメラをご存知でしょうか?
このカメラは、4Kカメラ・ステレオカメラ・AI演算アクセラレータ(Myriad Xイメージプロセスユニット)を搭載しており、物体認識・追跡が可能なサンプルプログラムが揃っています。
高機能なのは勿論のこと、特別な設定なしで深度を測定可能なカメラにしてはかなり安い3万円以下となっているのも魅力的で、値上がりしたRealSenseの代替になりうるポテンシャルを持っています。(レーザー照射という点で性質は異なりますが…)
日本では、スイッチサイエンスなどに在庫があり、結構手軽に購入できます。
C++でAPI叩きたい…!
OAK-Dカメラは、Pythonで使うのが最も楽でオススメです。
環境構築も簡単だし、使用例・記事もたくさん上がっています。
公式のサンプルであれば、depthai-pythonを見ると良さそうです。
しかし、私はC++で扱いたいなーと結構思ったりします。
というのも、ROSのラッパーにしたり、ロボット・組み込みを想定するのであれば、ROSであればComposableNodeにできるC++にするのが好ましいからです。
一応、GitHub - luxonis/depthai-rosというパッケージはありますが、いろいろな機能を取捨選択するならAPI直接叩きに勝るものはないのかなーと考えたり…
そこで、OAK-DのC++のAPIであるdepthai-coreを見たのですが、めっちゃ複雑でわかりにくすぎました…
Pythonプログラムは道を整備すればするほど簡単になりますが、C++はその逆が起こるのはなぜなのか…
テンプレート化
なんとしてもC++のAPIを叩いてやると決めたので、(できる限りシンプルな)プロジェクトのベースを作りました。(結果、半日かかりました)
流れとしては、bash setup_depthai_core.bash
で依存関係を全て解消しつつ、depthai-coreのビルドを行い、
そのライブラリを使って個人のプログラムをコンパイルさせるという感じです。
depthai-coreで最も悩まれるであろうCMakeListsについて少し詳しく説明します。
(意外と指定項目は少なかったです。)
cmake_minimum_required(VERSION 3.5) project("dai_core_template") set(CMAKE_CXX_STANDARD 14) if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic) endif() set(depthai_DIR depthai-core-lib) find_package(OpenCV REQUIRED) find_package(depthai CONFIG REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) # set compile target ------------------------------------------------------- set(TARGET stereo_hconcat) add_executable(${TARGET} examples/${TARGET}.cpp) target_include_directories(${TARGET} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> ) target_link_libraries( ${TARGET} ${OpenCV_LIBS} depthai::opencv )
【注意すべき点?】
CMAKE_CXX_STANDARD
は14に設定しています。(最初は指定していなかったのですが、めっちゃ文法エラーが出てきたので、14に引き上げました。)set(depthai_DIR depthai-core-lib)
は、depthai-coreがインストールされている場所を示しています。ここでは、CMakeListsのあるディレクトリと同じ階層にdepthai-core-lib
を作成し、そこにdepthai-coreのビルドファイルをインストールしました。(自動インストールスクリプトに記述)target_link_libraries
にdepthai::opencv
を追記します。depthai::opencv
自体にOpenCVが含まれているので、もしかしたらその上のOpenCVはいらないかもしれません。
ROS2を使用する場合は、ament_cmake
を使ってROS関連の設定を追記していくだけです。
実行
サンプルにstereo_hconcat
を入れています。
ステレオ画像を横にくっつけて1枚の画像にするプログラムです。
pipelineを引数に渡すdai::Device device;
はスマートポインタにして宣言しないといけないことが分からず、解決に時間がかかりました…