![]() |
OpenCV 5.0.0
Open Source Computer Vision
|
OpenCV (Open Source Computer Vision Library) は、オープンソースのコンピュータビジョンおよび機械学習のソフトウェアライブラリである。OpenCV は、コンピュータビジョンアプリケーションのための共通基盤を提供し、商用製品におけるマシンパーセプションの利用を加速することを目的に構築された。寛容なライセンスのもとで配布されており、OpenCV により企業はコードを容易に利用・改変できる。
このライブラリは2500を超える最適化されたアルゴリズムを備えており、古典的なものから最先端のものまで、コンピュータビジョンと機械学習の包括的なアルゴリズム群を含んでいる。これらのアルゴリズムは、顔の検出・認識、物体の識別、ビデオ内の人間の行動の分類、カメラの動きの追跡、移動物体の追跡、物体の3Dモデルの抽出、ステレオカメラからの3D点群の生成、複数画像のスティッチングによるシーン全体の高解像度画像の生成、画像データベースからの類似画像の検索、フラッシュ撮影画像からの赤目除去、視線移動の追跡、風景の認識と拡張現実によるオーバーレイのためのマーカーの設定などに利用できる。OpenCV は4万7千人を超えるユーザコミュニティを持ち、推定ダウンロード数は1800万を超える。このライブラリは企業・研究グループ・政府機関で幅広く利用されている。
Julia は、高性能・高水準・動的なプログラミング言語であり、数値計算や科学計算に関連するタスクに特化している。ただし、GUI を伴う一般的なプログラミングや Web プログラミングにも利用できる。Julia は、特殊な "just-ahead-of-time" コンパイルにより、Python のような高速なインタプリタ的プロトタイピング能力と C の生の速度を兼ね備えたものと考えられる。
それにもかかわらず、Julia は従来のコンピュータビジョンや画像処理のアルゴリズムを大きく欠いている。このことは、コンピュータビジョンを必要とするあらゆるパイプラインにおける Julia の利用を妨げている。Julia 向けの OpenCV バインディングはこの問題の解決を目指している。
Julia 向けの OpenCV バインディングは、構成時に Python スクリプトを使って自動的に生成され、その後システム上の Julia パッケージマネージャでインストールされる。これらのバインディングは、core、imgproc、imgcodecs、highgui、videio、calib3d、dnn の各モジュールに含まれる重要な機能のほとんどをカバーしている。これらのバインディングは CxxWrap.jl に依存しており、使用方法とコンパイルの手順については以下で詳しく説明する。バインディングは Ubuntu と Mac でテスト済みである。Windows でも動作する可能性はあるが、現時点では公式にはテスト・サポートされていない。
生成プロセスとバインディングの動作方式は Python バインディングと類似している。唯一の大きな違いは、CxxWrap.jl がオプション引数をサポートしていない点である。そのため、オプション引数を Julia コード内で定義する必要があり、これが多くの追加的な複雑さをもたらす。
バインディングをインストールする最も簡単で推奨される方法は、Julia 組み込みのパッケージマネージャを使うことである。OpenCV は Julia の登録パッケージとして利用可能であり、すべての主要なプラットフォームとアーキテクチャでサポートされている。以下の手順は Julia v1.6.1 で正しく動作することを確認している。
インストールするには Julia REPL を起動する。] を押してから add OpenCV と入力する。
バインディングをビルドする前に、Julia バインディングを除き、必要なすべての機能と contrib モジュールを含めて OpenCV をビルドする方法を理解しておくこと。前述のとおり、Julia バインディングは現時点では Windows では公式にサポートされておらず、WSL/WSL2 で試すほうがよい選択肢となる。
Julia バインディングの前提条件は以下のとおりである。
Julia 1.4以降と、CxxWrap.jl および libcxxwrap-julia の最新版を使用することが推奨される。
最初のステップは libcxxwrap-julia をソースからビルドすることである。その方法はリンク先で説明されている。また、リンク先で説明されているとおり、/.julia/artifacts/Overrides.toml でオーバーライドを設定する必要がある。
それが完了したら、Julia ターミナルを起動して REPL を開始するだけでよい。] を押してから add CxxWrap と入力する。
これで CxxWrap がインストールされる。このステップで、libcxxwrap-julia のオーバーライドが正しく設定されているかどうかも確認すること。これは CxxWrap.CxxWrapCore.prefix_path() の値を確認することで行える。出力には libcxxwrap-julia のビルドディレクトリが表示されるはずである。
これで Julia バインディングをビルドする準備が整った。cmake の構成コマンドに -DWITH_JULIA=ON を追加するだけで Julia バインディングがビルドされる。例えば次のようにする。
cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules -DWITH_JULIA=ON ../opencv
このコマンドは、親ディレクトリにリポジトリを含む opencv および opencv_contrib フォルダがあることを前提としている。cmake が Julia 実行ファイルを見つけられないと不平を言う場合は、次のように Julia_EXECUTABLE 変数を追加する。
cmake -DWITH_JULIA=ON -DJulia_EXECUTABLE=$HOME/julia-1.4.1/bin/julia ...
デフォルトでは、インストールされるパッケージはビルドディレクトリと同じディレクトリに置かれる。これは cmake 変数 JULIA_PKG_INSTALL_PATH を使って変更できる。
最後に、sudo make install と入力してバインディングを Julia パッケージマネージャに登録する。
バインディングを使用するには、単に次のように入力する。
これは make install を呼び出した場合にのみ機能する点に注意する。インストールターゲットを作成せずにラッパーパッケージを実行するには、まず環境変数 JULIA_LOAD_PATH を OpenCV パッケージを含むディレクトリに設定する必要がある。例えばビルドディレクトリ内では次のようにする。
Julia パッケージはいかなるシンボルもエクスポートしないため、すべての関数・構造体・定数には OpenCV というプレフィックスを付ける必要がある。
最後に、Julia は OOP パラダイムをサポートしていないため、いくつかの変更が必要であった。obj.function(ARGS) のような関数にアクセスするには、代わりに function(obj, ARGS) を使うべきである。以下の VideoCapture からフレームを読み取る例を見ると、より明確になるだろう。
cap.read() を呼び出す代わりに、OpenCV.read(cap) を呼び出した。
もう一つの変更点は、すべての整数定数と浮動小数点定数に、適切な型コンストラクタのプレフィックスを付ける必要がある場合があることである。これは、OpenCV の関数が32ビットの整数/浮動小数点を受け付けるのに対し、Julia の整数定数と浮動小数点定数は Julia が64ビットモードで動作しているか32ビットモードで動作しているかに応じてサイズが決まるためである。
では、付属サンプルの一つを実行してみよう。このチュートリアルでは face_detect_dnn.jl サンプルの実行方法を見ていく。このサンプルは、ディープニューラルネットワークを使ってウェブカメラのビデオストリーム内の顔を検出する。スクリーンショットは、代わりに画像を読み込むよう少し編集したバージョンのものである。まず opencv_contrib/modules/julia/samples/ に移動する。次に、リンクから "opencv_face_detector.pbtxt" と "opencv_face_detector_uint8.pb" の2つのファイルが必要になる。これらをダウンロードして face_detect_dnn.jl と同じディレクトリに置くだけでよい。これで実行する準備が整った。ターミナルを起動して、単に次のように入力する。
これで、ディープニューラルネットワークを使った顔検出の動作例が見られるはずである。
注意: サンプルの読み込みには時間がかかる場合がある。
以下は OpenCV.jl のバインディングとチュートリアルの貢献者の一覧である。