OpenCV 5.0.0 alpha変更点をキャッチアップしてOpenCV 5.0移行でライバルに差をつける

この記事は[OpenCV Advent Calendar 2024](https://qiita.com/advent-calendar/2024/opencv)の18日目の記事です。

## はじめに

2024年12月6日に[OpenCV 5.0.0 alpha](https://github.com/opencv/opencv/releases/tag/5.0.0-alpha)がリリースされました。この記事執筆時点では、alpha版ではありますが、OpenCV 5系リリースを心待ちにしていた方も多いのではないでしょうか？<https://github.com/opencv/opencv/wiki/OpenCV-Change-Logs#version50-alpha>にOpenCV 5.0.0 alpha変更点のハイライトが書いてあるのでこちらを読みながら正式版リリースに備えてキャッチアップしていきましょう。

:::note info
本記事では公式のChange Logsでは触れられていない変更経緯、追加情報を一部加筆しています。
:::

変更点は以下のものに分類されます。

- **[5+4.x]** 既に最新の4.x系に組み込まれているが重要なもの
- **[5.0]** 5.0リリース時点で完了予定のもの
- **[5.x]** 5.0リリースに何かしら入るが、以降の5.xリリースで完成を目指すもの

## OpenCV 5.0.0 alphaのハイライト

### 全般的な変更、改善

- **[5+4.x]** OpenCV 4.5.0以降およびOpenCV 5.0はApache 2 ライセンスで配布されるようになりました（[参考１](https://opencv.org/license/)、[参考２](https://opencv.org/opencv-is-to-change-the-license-to-apache-2/)）
- OpenCV 5.0のminimum C++ standardはC++ 17となりました。デフォルトはC++ 17となっていますが、C++ 20、C++ 23との互換性も計画されています。
- OpenCV 5.0でPython 2サポートは削除されました。Python 3の場合、Python 3.6+のみサポートされます。

### 大規模なリファクタリング

- OpenCV 4.xで一部残っていたC API（`cvCreateMat()`、`cvFindContours()`）や構造体（`CvMat`など）が削除されました。
  - `CV_8U`などの`CV_`マクロは残っています。
- OpenVXサポート削除
  - ベンダーがOpenCVアクセラレーションのためにOpenVXカーネルを使用する場合、後述するカスタム「非CPU」HALを使用してください
  - 詳細は<https://github.com/opencv/opencv/issues/24995>を参照ください。
- gapiモジュール（Graph API）のopencv_contribへの移動
  - 詳細は<https://github.com/opencv/opencv/issues/25000>を参照ください。
- mlモジュール（クラシックなMLアルゴリズム）のopencv_contribへの移動
  - 詳細は<https://github.com/opencv/opencv/issues/24997>を参照ください。
  - Pythonの場合、[scikit-learn](https://scikit-learn.org/)を使う方がはるかに優れているためです。
- features2dモジュールからfeaturesモジュールへのリネーム
  - 詳細は<https://github.com/opencv/opencv/issues/24999>を参照ください。
- **[5.0]** flannモジュール見直し
  - 近似最近傍検索は今日でもよく使われている重要なアルゴリズムである
  - しかし、flannモジュールのベースとなっているFLANN(<https://github.com/flann-lib/flann>)は非常に古く、メンテナンスされていない
  - そのため、Annoy(<https://github.com/spotify/annoy>)への置き換えを行う
  - 詳細は<https://github.com/opencv/opencv/issues/24998>、<https://github.com/opencv/opencv/pull/25708>を参照ください。
- objdetectモジュールにあったHaar-basedおよびHOG-based detectorsをopencv_contribのxobjdetectモジュールへの移動
  - コードクリーンアップのため、ディープラーニング以前のクラシックなobject detectionアルゴリズムをopencv_contribに移動
  - 詳細は<https://github.com/opencv/opencv/issues/25004>を参照ください。
- calib3dモジュールの分離
  - OpenCV 5.0から以下のモジュールに分離された
    - 3dモジュール：基本的な3Dジオメトリ、3Dビジョンアルゴリズム
    - calibモジュール：カメラキャリブレーションアルゴリズム
    - stereoモジュール：ステレオ対応による深度マップ推定アルゴリズム
  - 詳細は<https://github.com/opencv/opencv/pull/18940>、<https://github.com/opencv/opencv_contrib/pull/2767>を参照ください。
- サンプルコードクリーンアップ
  - 多くの古いサンプル(C++サンプルの約50%、Pythonサンプルの5%)が削除され、残りのサンプルの多くは改訂。

詳細を知りたい方は<https://github.com/opencv/opencv/issues/25007>を参照ください。

### coreモジュール改善

- サポートするデータ型の拡張
  - OpenCV 5.0から新規追加されるデータ型
    - bfloat (a.k.a. bfloat16_t): `CV_16BF`
    - uint32_t: `CV_32U`
    - uint64_t: `CV_64U`
    - int64_t: `CV_64S`
    - bool: `CV_Bool`
  - CV_Bool型のデータをマスクとして利用できるようになった
    - 詳細は<https://github.com/opencv/opencv/issues/25895>を参照してください。
  - hfloat、bfloatをネイティブにサポートしていないハードウェア上でも実行可能に
    - 必要に応じてインライン関数で効率的に変換を行う
- 2次元未満の配列、つまり 1D(ベクトル)と0D (スカラー)をサポート
- LAPACKをOpenCV内で常に利用できるようになった
  - システムに外部LAPACKライブラリがインストールされていない場合、OpenCVはLAPACKの内部の小さなサブセットを構築して使用
  - 詳細は<https://github.com/opencv/opencv/pull/18571>を参照ください。
- **[5.0、5.x]** 5.0リリースの前後にさらなるリファクタリングと改善が期待されています <https://github.com/opencv/opencv/issues/25011>

### imgprocモジュール改善

- warping処理（warpAffine、warpPerspective、remap）の高速化
  - プラットフォーム、画像サイズ、タイプ、操作フラグによるが、10%から300%以上高速化を図った
  - これらの関数およびその他の重要な画像処理関数のさらなる最適化は5.0正式リリースで対応予定
  - 詳細は<https://github.com/opencv/opencv/pull/26505>を参照ください。
- STBベースのTrueTypeエンジンと埋め込みTrueTypeフォントが使用されるようになりました。ユーザーはカスタムフォントを読み込んで使用することもできます。
  - STB対応については[putText()関数でtruetype fontを使ったテキスト描画ができるようになりました！ #OpenCV - Qiita](https://qiita.com/hon_no_mushi/items/b139df3dcf6559404b3f)を参照ください。
  - この機能を使う際、いくつかの注意点があります。
    1. アラビア語やデーヴァナーガリー文字などの一部の文字は適切にレンダリングされないため、Harfbuzzを追加する必要があります。
    1. いくつかの複合Unicode記号は適切にレンダリングされません。
    1. STBは単純な白黒エンジンであるため、カラー絵文字はサポートされていません。
- **[5.0、5.x]** 5.0リリースの前後にさらなるリファクタリングと改善が予定されています <https://github.com/opencv/opencv/issues/25012>

### HAL(Hardware Acceleration Layer)更新

HAL(Hardware Acceleration Layer)について気になる方は[OpenCVのHALモジュールと高速な数値計算ライブラリ #画像処理 - Qiita](https://qiita.com/fukushima1981/items/69c653e09f553b2d4134)を参照ください。

- **[5+4.x]** OpenCV HALに多くの新しいエントリが追加され、さまざまなベンダーがOpenCV関数にカスタムアクセラレーションを提供できるようになりました。5.0では、さらにいくつかの新しいHALエントリが追加されます。
- **[5+4.x]** アルゴリズムによっては、ユーザーが速度と精度のどちらかを優先するかを選択できるように`AlgorithmHint`でヒント情報を設定できるようになりました。これは、ベンダーが高速な実装を提供していてもOpenCVのジェネリックな実装と出力互換性がないケースを考慮するためです。
  - `ALGO_HINT_DEFAULT`
  - `ALGO_HINT_ACCURATE`
  - `ALGO_HINT_FAST`
- **[5+4.x]** ディープラーニング推論、画像処理、その他のアルゴリズムを高速化するために数学関数 (v_exp, v_log, v_erf, v_sincos)の実装がUniversal intrinsicsに追加されました。
  - 詳細は<https://github.com/opencv/opencv/pull/24941>を参照してください。
- Universal intrinsicsにおけるFP16実装がARMv8 NEONおよびRISC-V RVVバックエンドに追加されました。FP16 SIMD演算はデフォルトでは利用できないため、特別なオプションを使用してコードをビルドする必要があります。OpenCVでは、実際のハードウェアに応じて最適なカーネルの種類を選択するランタイムディスパッチメカニズムを使用します。
- **[5.0, 5.x]** UMatは、CPUまたは非CPUの配列/テンソルを格納できるように拡張されます。つまり、OpenCLのみのソリューション (T-API)から、ユニバーサルな異種API(U-APIまたは「非CPU HAL」と呼ぶこともあります)に移行し、UMatがそのメインのデータコンテナーになります。他にも多くの改善が期待されています。<https://github.com/opencv/opencv/issues/25019>、<https://github.com/opencv/opencv/issues/25025>

### dnnモジュール更新

- 新しい推論エンジンが導入され、古い推論エンジンと共存できるようになりました。新しい推論エンジンは、dynamic shapesやその他の最新のONNX機能のサポートを強化します。5.0では、古い推論エンジンよりもONNX仕様のカバレッジが大幅に向上しました。
- 使用する推論エンジンを制御するためのパラメータが`cv::dnn::readNet()`に追加されました。詳細は<https://docs.opencv.org/5.x/d6/d0f/group__dnn.html#gab13999feed711a37d50c1bdb4f01b458>を参照ください。
  - デフォルトでは、最初に新しいエンジンを試し、モデルのロードに失敗すると、古い推論エンジンに戻ります。新しい推論エンジンまたは古い推論エンジンを強制的に使用することもできます。内部表現が異なるため、モデルがロードされた後に推論エンジンを切り替えることはできません。
- ONNX、Caffe、TF、TFLite形式のパーサーが更新され、エンジンが選択できるようになりました。
- **[5.0, 5.x]** 新しいエンジンはデフォルトのバックエンドとCPUターゲットのみをサポートしています。5.0までにさらに多くのバックエンドとターゲットが有効になり、その後の5.xリリースではさらに多くのバックエンドが有効になる予定です。 [#26198](https://github.com/opencv/opencv/issues/26198)

### calib3dモジュール更新

- **[5+4.x]** ホモグラフィ、基本行列の推定、PnP 問題の解決などを行う RANSAC ベースのアルゴリズムに、大幅に効率化された USAC フレームワーク (特にノイズの多いデータセットの場合) が使用されるようになりました。詳細は<https://docs.opencv.org/5.x/de/d3e/tutorial_usac.html>を参照ください。
- 新しい Levenberg Marquardtアルゴリズムが実装され、高速化および精度向上しています。
  - 詳細は<https://github.com/opencv/opencv/pull/21018>を参照してください。
- 効率的なマルチカメラ キャリブレーション フレームワークが calib モジュールに追加されました。これには、スマート初期化と USAC ベースの最適化パイプラインが含まれており、同時にキャリブレーションされたすべてのカメラの相対位置を最初のカメラに対して計算します。さまざまなカメラ構成がサポートされています (すべてのピンホール カメラ、すべての魚眼カメラ、および混合ケース)。詳細については[チュートリアル](https://docs.opencv.org/5.x/d6/d36/tutorial_multiview_camera_calibration.html)を参照してください。
- 基本的なメッシュ処理およびポイントクラウド処理アルゴリズム (TSDF、ICP など) に関する作業を開始
- .plyや.objなどの一般的なポイントクラウド形式のインポーターとエクスポーターを追加

### サンプルコード改訂

- classification、segmentation、object detection、edge detection、tracking、person reidのサンプルコード改訂
  - `cd <opencv>/samples/dnn && python3 download_models.py`でモデルコレクションをダウンロード可
- [LLM (GPT2)のサンプル](https://github.com/opencv/opencv/blob/5.0.0-alpha/samples/dnn/gpt2_inference.py)、[diffusion(LDM)モデルのサンプル](https://github.com/opencv/opencv/blob/5.0.0-alpha/samples/dnn/ldm_inpainting.py)追加

## おわりに

本記事ではOpenCV 5.0.0 alpha変更点のハイライトを駆け足で追っていきました。変更点をキャッチアップしてOpenCV 5.0移行でライバルに差をつけていきましょう。明日は@nonbiri15さんの担当でタイトルは「Open3Dを使い始めてみた」です。お楽しみに。