OpenCV 5.0.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 5.0.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
cv::LevMarq クラス

Levenberg-Marquadt ソルバ。詳細...

#include <opencv2/geometry/3d.hpp>

Collaboration diagram for cv::LevMarq:

クラス

struct  Report
 最適化のレポート。詳細...
 
struct  Settings
 LevMarq の設定を保持する構造体。詳細...
 

公開型

typedef std::function< bool(InputOutputArray, OutputArray, OutputArray)> LongCallback
 
typedef std::function< bool(InputOutputArray, OutputArray, OutputArray, double &)> NormalCallback
 

公開メンバ関数

 LevMarq (InputOutputArray param, LongCallback callback, const Settings &settings=Settings(), InputArray mask=noArray(), MatrixType matrixType=MatrixType::AUTO, VariableType paramType=VariableType::LINEAR, int nerrs=0, int solveMethod=DECOMP_SVD)
 
 LevMarq (InputOutputArray param, NormalCallback callback, const Settings &settings=Settings(), InputArray mask=noArray(), MatrixType matrixType=MatrixType::AUTO, VariableType paramType=VariableType::LINEAR, bool LtoR=false, int solveMethod=DECOMP_SVD)
 
 LevMarq (int nvars, LongCallback callback, const Settings &settings=Settings(), InputArray mask=noArray(), MatrixType matrixType=MatrixType::AUTO, VariableType paramType=VariableType::LINEAR, int nerrs=0, int solveMethod=DECOMP_SVD)
 
 LevMarq (int nvars, NormalCallback callback, const Settings &settings=Settings(), InputArray mask=noArray(), MatrixType matrixType=MatrixType::AUTO, VariableType paramType=VariableType::LINEAR, bool LtoR=false, int solveMethod=DECOMP_SVD)
 
Report optimize ()
 
Report run (InputOutputArray param)
 渡されたパラメータベクトルを開始点として最適化を実行する。
 

詳細説明

Levenberg-Marquadt ソルバ。

Levenberg-Marquadt アルゴリズムは、現在のパラメータベクトルを起点として、目的関数の値(エネルギー、コスト、誤差とも呼ばれる)を局所的に最小化する。これを行うため、各反復ではプローブ点におけるエネルギーが減少するまで繰り返し計算する。プローブ点を計算するには、次の線形方程式を解く: (J^T*J + lambda*D)*dx = -J^T*b ここで J は関数のヤコビアン、b は残差(誤差またはエネルギー項とも呼ばれる)のベクトル、D は J^T*J の対角成分から生成される対角行列であり、lambda はプローブ点ごとに変化する。得られた dx を現在の変数に「加算」してプローブ値を形成する。「加算」を括弧書きにしたのは、一部の群(たとえば SO(3) 群)ではこの増分が自明でない操作になり得るためである。

詳細については Wikipedia のページ (https://en.wikipedia.org/wiki/Levenberg%E2%80%93Marquardt_algorithm) を参照のこと。

このソルバは固定変数と2種類のコールバック関数をサポートする:

  1. 通常のヤコビアン J と残差ベクトル err を生成する(「long」形式)
  2. 正規方程式行列 J^T*J と勾配ベクトル J^T*err を生成する

現在のところ、ソルバは密なヤコビアン行列と線形なパラメータ増分をサポートする。

型定義メンバ詳解

◆ LongCallback

「Long」コールバック: f(param, &err, &J) -> bool 指定されたパラメータベクトルに対する誤差とヤコビアンを計算し、成功時に true を返す。

param: 現在のパラメータベクトル err: 誤差の出力ベクトル: err_i = actual_f_i - ideal_f_i J: ヤコビアンの出力: J_ij = d(ideal_f_i)/d(param_j)

パラメータベクトルの値は、固定されている場合に限りコールバックで変更してよい。固定されていない変数を変更すると、誤った結果につながる可能性がある。J=noArray() のとき、それは計算する必要がないことを意味する。誤差ベクトルとパラメータベクトルの次元は異なっていてよい。コールバックは各出力配列を(noArray() でない限り)「create」メソッドで明示的に確保する必要がある。

◆ NormalCallback

Normal コールバック: f(param, &JtErr, &JtJ, &errnorm) -> bool

二乗 L2 誤差ノルム、正規方程式行列 J^T*J、および J^T*err ベクトルを計算する。ここで J は MxN のヤコビアン: J_ij = d(err_i)/d(param_j)、err は Mx1 の誤差ベクトル: err_i = actual_f_i - ideal_f_i、M は誤差項の数、N は最適化する変数の数である。誤差項の数が変数の数を大きく上回る場合、通常の Callback の代わりにこのクラスを使うとよい。

param: 現在の Nx1 パラメータベクトル JtErr: 出力 Nx1 ベクトル J^T*err JtJ: 出力 NxN 行列 J^T*J errnorm: 出力総誤差: dot(err, err)

パラメータベクトルの値は、固定されている場合に限りコールバックで変更してよい。固定されていない変数を変更すると、誤った結果につながる可能性がある。JtErr または JtJ が空の場合、それらを計算する必要はない。コールバックは各出力配列を(noArray() でない限り)「create」メソッドで明示的に確保する必要がある。

構築子と解体子の詳解

◆ LevMarq() [1/4]

cv::LevMarq::LevMarq ( int nvars,
LongCallback callback,
const Settings & settings = Settings(),
InputArray mask = noArray(),
MatrixType matrixType = MatrixType::AUTO,
VariableType paramType = VariableType::LINEAR,
int nerrs = 0,
int solveMethod = DECOMP_SVD )

ソルバを生成する

引数
nvarsパラメータベクトル中の変数の数
callback「Long」コールバック。各エネルギー項についてヤコビアンと残差を生成し、成功時にtrueを返す
settingsLevMarq の設定構造体。詳細はLevMarqBaseクラスを参照
mask最適化中にどの変数を固定するか(ゼロ)、どの変数を最適化するか(非ゼロ)を示す
matrixTypeソルバで使用する行列の型。現在はDENSEとAUTOのみがサポートされている
paramType最適化されるパラメータの型。現在はLINEARのみがサポートされている
nerrsエネルギー項の数。ゼロの場合は、コールバックが生成するヤコビアンのサイズが代わりに使われる
solveMethod線形システムを解くために使用する手法
この関数の呼び出しグラフ:

◆ LevMarq() [2/4]

cv::LevMarq::LevMarq ( int nvars,
NormalCallback callback,
const Settings & settings = Settings(),
InputArray mask = noArray(),
MatrixType matrixType = MatrixType::AUTO,
VariableType paramType = VariableType::LINEAR,
bool LtoR = false,
int solveMethod = DECOMP_SVD )

ソルバを生成する

引数
nvarsパラメータベクトル中の変数の数
callback通常のコールバック。JとbではなくJ^T*JとJ^T*bを直接生成し、成功時にtrueを返す
settingsLevMarq の設定構造体。詳細はLevMarqBaseクラスを参照
mask最適化中にどの変数を固定するか(ゼロ)、どの変数を最適化するか(非ゼロ)を示す
matrixTypeソルバで使用する行列の型。現在はDENSEとAUTOのみがサポートされている
paramType最適化されるパラメータの型。現在はLINEARのみがサポートされている
LtoR対称行列のどの部分を別の部分にコピーするか(下三角または上三角)を指定する。alt. callback でのみ使用する
solveMethod線形システムを解くために使用する手法
この関数の呼び出しグラフ:

◆ LevMarq() [3/4]

cv::LevMarq::LevMarq ( InputOutputArray param,
LongCallback callback,
const Settings & settings = Settings(),
InputArray mask = noArray(),
MatrixType matrixType = MatrixType::AUTO,
VariableType paramType = VariableType::LINEAR,
int nerrs = 0,
int solveMethod = DECOMP_SVD )

ソルバを生成する

引数
param開始パラメータベクトルと、最適化結果のパラメータを格納する入出力ベクトル
callback「Long」コールバック。各エネルギー項についてヤコビアンと残差を生成し、成功時にtrueを返す
settingsLevMarq の設定構造体。詳細はLevMarqBaseクラスを参照
mask最適化中にどの変数を固定するか(ゼロ)、どの変数を最適化するか(非ゼロ)を示す
matrixTypeソルバで使用する行列の型。現在はDENSEとAUTOのみがサポートされている
paramType最適化されるパラメータの型。現在はLINEARのみがサポートされている
nerrsエネルギー項の数。ゼロの場合は、コールバックが生成するヤコビアンのサイズが代わりに使われる
solveMethod線形システムを解くために使用する手法
この関数の呼び出しグラフ:

◆ LevMarq() [4/4]

cv::LevMarq::LevMarq ( InputOutputArray param,
NormalCallback callback,
const Settings & settings = Settings(),
InputArray mask = noArray(),
MatrixType matrixType = MatrixType::AUTO,
VariableType paramType = VariableType::LINEAR,
bool LtoR = false,
int solveMethod = DECOMP_SVD )

ソルバを生成する

引数
param開始パラメータベクトルと、最適化結果のパラメータを格納する入出力ベクトル
callback通常のコールバック。JとbではなくJ^T*JとJ^T*bを直接生成し、成功時にtrueを返す
settingsLevMarq の設定構造体。詳細はLevMarqBaseクラスを参照
mask最適化中にどの変数を固定するか(ゼロ)、どの変数を最適化するか(非ゼロ)を示す
matrixTypeソルバで使用する行列の型。現在はDENSEとAUTOのみがサポートされている
paramType最適化されるパラメータの型。現在はLINEARのみがサポートされている
LtoR対称行列のどの部分を別の部分にコピーするか(下三角または上三角)を指定する。alt. callback でのみ使用する
solveMethod線形システムを解くために使用する手法
この関数の呼び出しグラフ:

メンバ関数詳解

◆ optimize()

Report cv::LevMarq::optimize ( )

現在の設定と与えられたパラメータベクトルを用いて Levenberg-Marquadt アルゴリズムを実行する。このメソッドは最適化のレポートを返す。

◆ run()

Report cv::LevMarq::run ( InputOutputArray param)

渡されたパラメータベクトルを開始点として最適化を実行する。

(アルゴリズムが収束したかどうかにかかわらず)最終的なパラメータベクトルは同じベクトルに格納される。異なる開始点で再実行する必要がある場合、このメソッドを optimize() メソッドの代わりに使用できる。このメソッドは最適化のレポートを返す。

引数
paramパラメータの初期/最終ベクトル。

パラメータ空間の次元はparamベクトルのサイズによって定義され、最適化される基準の次元はコールバックによって計算されるerrベクトルのサイズによって定義されることに注意する。


このクラス詳解は次のファイルから抽出されました: