![]() |
OpenCV 4.13.0
Open Source Computer Vision
|
前のチュートリアル: OpenCVのドキュメント作成
次のチュートリアル: 他のDoxygenプロジェクトからOpenCVを相互参照する
| 原著者 | Maksim Shabunin |
| 互換性 | OpenCV >= 3.0 |
このドキュメントは、自分のコードをOpenCV 3.0に移行したいソフトウェア開発者を対象としている。
OpenCV 3.0では、バージョン2.4と比較して多くの新しいアルゴリズムと機能が導入された。一部のモジュールは書き直され、一部は再編成された。2.4のアルゴリズムのほとんどは引き続き存在するが、インターフェースが異なる場合がある。
このセクションでは、最も注目すべき変更点を全般的に説明する。移行作業のすべての詳細と例は、このドキュメントの次のパートにある。
https://github.com/opencv/opencv_contrib
ここはすべての新しい、実験的な、および非フリーのアルゴリズムのための場所である。メインリポジトリと比較してサポートチームからの注目はそれほど受けないが、コミュニティが良好な状態に保つよう努めている。
contrib リポジトリ付きでOpenCVをビルドするには、cmakeコマンドに次のオプションを追加する:
2.4ではすべてのヘッダーが対応するモジュールのサブフォルダ(opencv2/<module>/<module>.hpp)に配置されていたが、3.0ではモジュール機能のほとんどを含むトップレベルのモジュールヘッダー(opencv2/<module>.hpp)があり、すべてのCスタイルAPI定義は別のヘッダー(例: opencv2/core/core_c.h)に移動された。
アルゴリズムの一般的な使用パターンが変更された: 現在は、スマートポインタ cv::Ptr でラップしてヒープ上に作成する必要がある。バージョン2.4では、スタックとヒープの両方の割り当てが、直接またはスマートポインタ経由で許可されていた。
get および set メソッドは、CV_INIT_ALGORITHM マクロとともに cv::Algorithm クラスから削除された。3.0では、すべてのプロパティが getProperty/setProperty の純粋仮想メソッドのペアに変換された。その結果、名前を使って(汎用の Algorithm::create(String) メソッドを使って)cv::Algorithm インスタンスを作成して使用することは できなく なり、対応するファクトリメソッドを明示的に呼び出す必要がある。
このセクションでは、具体的なアクションを例とともに説明する。
最新の OpenCV 2.4.11 で加えられた変更により、現在のコードベースを移行に向けて準備できる:
注意: 移行を容易にするための変更は OpenCV 3.0 で行われているため、以下の手順は必須ではないが推奨される。
initModule_<moduleName>() の呼び出しを削除するこのモジュールは書き直されたため、ソフトウェアを適応させるにはいくらかの作業が必要となる。すべてのアルゴリズムは、基底クラス StatModel とともに専用の ml 名前空間に配置されている。個別の SomeAlgoParams クラスは、対応する一連の getProperty/setProperty メソッドに置き換えられた。
次の表は 2.4 と 3.0 の機械学習クラスの対応を示す。
| 2.4 | 3.0 |
|---|---|
| CvStatModel | cv::ml::StatModel |
| CvNormalBayesClassifier | cv::ml::NormalBayesClassifier |
| CvKNearest | cv::ml::KNearest |
| CvSVM | cv::ml::SVM |
| CvDTree | cv::ml::DTrees |
| CvBoost | cv::ml::Boost |
| CvGBTrees | 未実装 |
| CvRTrees | cv::ml::RTrees |
| CvERTrees | 未実装 |
| EM | cv::ml::EM |
| CvANN_MLP | cv::ml::ANN_MLP |
| 未実装 | cv::ml::LogisticRegression |
| CvMLData | cv::ml::TrainData |
3.0 で書き直された ml アルゴリズムは xml/yml ファイルから古い学習済みモデルを読み込めるが、予測処理に差異が生じる可能性がある。
points_classifier.cpp サンプルからの次のコード断片は、モデル学習処理の違いを示している:
一部のアルゴリズム (FREAK, BRIEF, SIFT, SURF) は opencv_contrib リポジトリの xfeatures2d モジュール、xfeatures2d 名前空間へ移された。それらのインターフェースも変更された (基底クラス cv::Feature2D を継承するようになった)。
xfeatures2d モジュールのクラス一覧:
次の手順が必要となる:
opencv2/xfeatures2d.h ヘッダをインクルードするxfeatures2d を使用するoperator() の呼び出しを detect, compute, detectAndCompute に置き換える一部のクラスでは、独自の operator() の代わりに Feature2D 基底クラスが提供する汎用メソッド detect, compute, detectAndCompute を使用するようになった
次のコード断片はその違いを示す (video_homography.cpp サンプルより):
すべての特化された ocl 実装は、汎用の C++ アルゴリズムインターフェースの背後に隠蔽された。これにより、関数の実行経路を実行時に動的に選択できるようになった: CPU か OpenCL か。この仕組みは「Transparent API」とも呼ばれる。
新しいクラス cv::UMat は、OpenCL デバイスとのデータ交換を便利な形で隠蔽することを目的としている。
次の例は API の変更を示す (OpenCV サイトより):
CUDA モジュールは opencv_contrib リポジトリへ移された。
ドキュメントは Doxygen 形式に変換された。更新されたドキュメント執筆ガイドは、OpenCV リファレンスドキュメントの Tutorials セクションにある (OpenCV のドキュメント執筆)。
場合によっては、両方のバージョンの OpenCV に対応することが可能である。
アプリケーションのソースコードでライブラリのメジャーバージョンを確認するには、次の方法を用いるべきである:
ビルドシステムでライブラリのバージョンを確認することで、アプリケーション内で異なるモジュールをリンクしたり、一部の機能を有効化/無効化したりできる。これには標準的な cmake や pkg-config の変数を使用できる:
OpenCV_VERSION には完全なバージョンが含まれる。例えば "2.4.11" や "3.0.0" などOpenCV_VERSION_MAJOR にはメジャーバージョン番号のみが含まれる。2 または 3Version がある例: