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

詳細説明

クラス

class  cv::DenseOpticalFlow
 
class  cv::DISOpticalFlow
 DISオプティカルフローアルゴリズム。 続きを読む...
 
struct  cv::ECCParameters
 構造体 ECCParameters は findTransformECCMultiScale で使用される 続き...
 
class  cv::FarnebackOpticalFlow
 Gunnar Farnebackのアルゴリズムを用いて密なオプティカルフローを計算するクラス。 続きを読む...
 
class  cv::KalmanFilter
 カルマンフィルタクラス。 続きを読む...
 
class  cv::SparseOpticalFlow
 疎なオプティカルフローアルゴリズムの基底インターフェース。 詳細...
 
class  cv::SparsePyrLKOpticalFlow
 疎なオプティカルフローを計算するためのクラス。 詳細...
 
class  cv::Tracker
 長期トラッカーの基底抽象クラス。 詳細...
 
class  cv::TrackerDaSiamRPN
 
class  cv::TrackerMIL
 MILアルゴリズムは、オンラインで識別器を学習し、対象を背景から分離する。 詳細...
 
class  cv::TrackerNano
 Nanoトラッカーは、dnnベースの超軽量な汎用物体追跡である。 詳細...
 
class  cv::TrackerVit
 VITトラッカーは、dnnベースの超軽量な汎用物体追跡である。 詳細...
 
class  cv::VariationalRefinement
 変分法によるオプティカルフローの精緻化。 詳細...
 

列挙型

enum  {
  cv::OPTFLOW_USE_INITIAL_FLOW = 4 ,
  cv::OPTFLOW_LK_GET_MIN_EIGENVALS = 8 ,
  cv::OPTFLOW_FARNEBACK_GAUSSIAN = 256
}
 
enum  {
  cv::MOTION_TRANSLATION = 0 ,
  cv::MOTION_EUCLIDEAN = 1 ,
  cv::MOTION_AFFINE = 2 ,
  cv::MOTION_HOMOGRAPHY = 3
}
 

関数

int cv::buildOpticalFlowPyramid (InputArray img, OutputArrayOfArrays pyramid, Size winSize, int maxLevel, bool withDerivatives=true, int pyrBorder=BORDER_REFLECT_101, int derivBorder=BORDER_CONSTANT, bool tryReuseInputImage=true)
 calcOpticalFlowPyrLK に渡すことのできる画像ピラミッドを構築する。
 
void cv::calcOpticalFlowFarneback (InputArray prev, InputArray next, InputOutputArray flow, double pyr_scale, int levels, int winsize, int iterations, int poly_n, double poly_sigma, int flags)
 Gunnar Farnebackのアルゴリズムを用いて密なオプティカルフローを計算する。
 
void cv::calcOpticalFlowPyrLK (InputArray prevImg, InputArray nextImg, InputArray prevPts, InputOutputArray nextPts, OutputArray status, OutputArray err, Size winSize=Size(21, 21), int maxLevel=3, TermCriteria criteria=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01), int flags=0, double minEigThreshold=1e-4)
 ピラミッドを用いた反復Lucas-Kanade法により、疎な特徴集合に対するオプティカルフローを計算する。
 
RotatedRect cv::CamShift (InputArray probImage, Rect &window, TermCriteria criteria)
 オブジェクトの中心・サイズ・向きを求める。
 
double cv::computeECC (InputArray templateImage, InputArray inputImage, InputArray inputMask=noArray())
 2つの画像間の拡張相関係数 (ECC) 値を計算する。
 
Mat cv::estimateRigidTransform (InputArray src, InputArray dst, bool fullAffine)
 2つの2D点群の間で最適なアフィン変換を計算する。
 
double cv::findTransformECC (InputArray templateImage, InputArray inputImage, InputOutputArray warpMatrix, int motionType, TermCriteria criteria, InputArray inputMask, int gaussFiltSize)
 ECC基準に基づいて2つの画像間の幾何変換(ワープ)を求める [84]
 
double cv::findTransformECC (InputArray templateImage, InputArray inputImage, InputOutputArray warpMatrix, int motionType=MOTION_AFFINE, TermCriteria criteria=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 50, 0.001), InputArray inputMask=noArray())
 
double cv::findTransformECCMultiScale (InputArray reference, InputArray sample, InputOutputArray warpMatrix, const ECCParameters &eccParams=ECCParameters(), InputArray referenceMask=noArray(), InputArray sampleMask=noArray())
 ECC 基準 [84] に基づいて 2 枚の画像間の幾何変換(ワープ)を求める。ピラミッドを使用する。
 
double cv::findTransformECCWithMask (InputArray templateImage, InputArray inputImage, InputArray templateMask, InputArray inputMask, InputOutputArray warpMatrix, int motionType=MOTION_AFFINE, TermCriteria criteria=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 50, 1e-6), int gaussFiltSize=5)
 テンプレートと入力画像の両方に対する有効性マスクを用いて、ECC基準に基づき2つの画像間の幾何変換(ワープ)を求める [84]
 
int cv::meanShift (InputArray probImage, Rect &window, TermCriteria criteria)
 バックプロジェクション画像上でオブジェクトを探索する。
 
Mat cv::readOpticalFlow (const String &path)
 .flo ファイルを読み込む。
 
bool cv::writeOpticalFlow (const String &path, InputArray flow)
 .flo をディスクに書き込む。
 

列挙型詳解

◆ anonymous enum

anonymous enum

#include <opencv2/video/tracking.hpp>

列挙値
OPTFLOW_USE_INITIAL_FLOW 
Python: cv.OPTFLOW_USE_INITIAL_FLOW
OPTFLOW_LK_GET_MIN_EIGENVALS 
Python: cv.OPTFLOW_LK_GET_MIN_EIGENVALS
OPTFLOW_FARNEBACK_GAUSSIAN 
Python: cv.OPTFLOW_FARNEBACK_GAUSSIAN

◆ anonymous enum

anonymous enum

#include <opencv2/video/tracking.hpp>

列挙値
MOTION_TRANSLATION 
Python: cv.MOTION_TRANSLATION
MOTION_EUCLIDEAN 
Python: cv.MOTION_EUCLIDEAN
MOTION_AFFINE 
Python: cv.MOTION_AFFINE
MOTION_HOMOGRAPHY 
Python: cv.MOTION_HOMOGRAPHY

関数詳解

◆ buildOpticalFlowPyramid()

int cv::buildOpticalFlowPyramid ( InputArray img,
OutputArrayOfArrays pyramid,
Size winSize,
int maxLevel,
bool withDerivatives = true,
int pyrBorder = BORDER_REFLECT_101,
int derivBorder = BORDER_CONSTANT,
bool tryReuseInputImage = true )
Python:
cv.buildOpticalFlowPyramid(img, winSize, maxLevel[, pyramid[, withDerivatives[, pyrBorder[, derivBorder[, tryReuseInputImage]]]]]) -> retval, pyramid

#include <opencv2/video/tracking.hpp>

calcOpticalFlowPyrLK に渡すことのできる画像ピラミッドを構築する。

引数
img8ビット入力画像。
pyramid出力ピラミッド。
winSizeオプティカルフローアルゴリズムのウィンドウサイズ。calcOpticalFlowPyrLK の winSize 引数以上でなければならない。これはピラミッドの各レベルに必要なパディングを計算するために必要となる。
maxLevel0始まりのピラミッドの最大レベル番号。
withDerivativesピラミッドの各レベルについて勾配を事前計算する場合に設定する。勾配なしでピラミッドが構築された場合、calcOpticalFlowPyrLK が内部でそれらを計算する。
pyrBorderピラミッド層の境界モード。
derivBorder勾配の境界モード。
tryReuseInputImage可能であれば入力画像のROIをピラミッドに含める。false を渡すとデータコピーを強制できる。
戻り値
構築されるピラミッドのレベル数。maxLevel より少なくなる場合がある。

◆ calcOpticalFlowFarneback()

void cv::calcOpticalFlowFarneback ( InputArray prev,
InputArray next,
InputOutputArray flow,
double pyr_scale,
int levels,
int winsize,
int iterations,
int poly_n,
double poly_sigma,
int flags )
Python:
cv.calcOpticalFlowFarneback(prev, next, flow, pyr_scale, levels, winsize, iterations, poly_n, poly_sigma, flags) -> flow

#include <opencv2/video/tracking.hpp>

Gunnar Farneback のアルゴリズムを用いて密なオプティカルフローを計算する。

引数
prev1番目の8ビットシングルチャンネル入力画像。
nextprevと同じサイズかつ同じ型の2番目の入力画像。
flowprevと同じサイズで型がCV_32FC2の計算されたフロー画像。
pyr_scale各画像のピラミッドを構築するための画像スケール(<1)を指定する引数。pyr_scale=0.5 は古典的なピラミッドを意味し、次の各層が前の層より2倍小さくなる。
levels初期画像を含むピラミッド層の数。levels=1 は追加の層が作成されず元の画像のみが使用されることを意味する。
winsize平均化ウィンドウのサイズ。大きい値はアルゴリズムの画像ノイズに対するロバスト性を高め、速い動きを検出しやすくするが、より平滑化された動きフィールドになる。
iterations各ピラミッド層でアルゴリズムが行う反復回数。
poly_n各ピクセルで多項式展開を求める際に使われるピクセル近傍のサイズ。値が大きいほど画像がより滑らかな面で近似され、よりロバストなアルゴリズムとなり、動きベクトル場がより平滑になる。一般的には poly_n =5 または 7。
poly_sigma多項式展開の基礎として用いる微分を平滑化するために使われるガウシアンの標準偏差。poly_n=5 の場合は poly_sigma=1.1 を設定でき、poly_n=7 の場合は poly_sigma=1.5 が適切な値となる。
flags以下の組み合わせを指定できる演算フラグ:
  • OPTFLOW_USE_INITIAL_FLOW 入力フローを初期フロー近似として使用する。
  • OPTFLOW_FARNEBACK_GAUSSIAN オプティカルフロー推定に、同じサイズのボックスフィルタの代わりにガウシアンの \(\texttt{winsize}\times\texttt{winsize}\) フィルタを使用する。通常このオプションはボックスフィルタよりも正確なフローを与えるが、速度は低下する。同程度のロバスト性を得るには、通常ガウシアンウィンドウの winsize をより大きな値に設定すべきである。

この関数は [86] アルゴリズムを用いて各 prev ピクセルのオプティカルフローを求める。すなわち

\[\texttt{prev} (y,x) \sim \texttt{next} ( y + \texttt{flow} (y,x)[1], x + \texttt{flow} (y,x)[0])\]

覚え書き
いくつかの例:
  • Gunnar Farneback が記述したオプティカルフローアルゴリズムを使った例は opencv_source_code/samples/cpp/fback.cpp にある
  • (Python) Gunnar Farneback が記述したオプティカルフローアルゴリズムを使った例は opencv_source_code/samples/python/opt_flow.py にある

◆ calcOpticalFlowPyrLK()

void cv::calcOpticalFlowPyrLK ( InputArray prevImg,
InputArray nextImg,
InputArray prevPts,
InputOutputArray nextPts,
OutputArray status,
OutputArray err,
Size winSize = Size(21, 21),
int maxLevel = 3,
TermCriteria criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01),
int flags = 0,
double minEigThreshold = 1e-4 )
Python:
cv.calcOpticalFlowPyrLK(prevImg, nextImg, prevPts, nextPts[, status[, err[, winSize[, maxLevel[, criteria[, flags[, minEigThreshold]]]]]]]) -> nextPts, status, err

#include <opencv2/video/tracking.hpp>

ピラミッドを用いた反復的なLucas-Kanade法により、疎な特徴セットのオプティカルフローを計算する。

引数
prevImg1枚目の8ビット入力画像、または buildOpticalFlowPyramid で構築されたピラミッド。
nextImgprevImg と同じサイズ・同じ型の2枚目の入力画像、またはピラミッド。
prevPtsフローを求める対象となる 2D 点のベクトル。点の座標は単精度浮動小数点数でなければならない。
nextPts2番目の画像における入力特徴の計算後の新しい位置を含む、2D点(単精度浮動小数点座標)の出力ベクトル。OPTFLOW_USE_INITIAL_FLOW フラグが渡された場合、このベクトルは入力と同じサイズでなければならない。
status出力ステータスベクトル(unsigned char 型)。対応する特徴のフローが見つかった場合、ベクトルの各要素は1に設定され、そうでない場合は0に設定される。
err誤差の出力ベクトル。ベクトルの各要素は対応する特徴に対する誤差に設定される。誤差尺度の種類は flags 引数で設定できる。フローが見つからなかった場合は誤差は定義されない(そのようなケースを見つけるには status 引数を使用する)。
winSize各ピラミッドレベルにおける探索ウィンドウのサイズ。
maxLevel0始まりのピラミッドの最大レベル番号。0に設定するとピラミッドは使用されず(単一レベル)、1に設定すると2レベル、以下同様となる。入力にピラミッドが渡された場合、アルゴリズムはピラミッドが持つだけのレベルを使用するが、maxLevel を超えることはない。
criteria反復探索アルゴリズムの終了条件を指定する引数(指定された最大反復回数 criteria.maxCount に達したとき、または探索ウィンドウの移動量が criteria.epsilon 未満になったとき)。
flags操作フラグ:
  • OPTFLOW_USE_INITIAL_FLOW nextPts に格納された初期推定値を使用する。このフラグが設定されていない場合、prevPts が nextPts にコピーされ、初期推定値とみなされる。
  • OPTFLOW_LK_GET_MIN_EIGENVALS 誤差尺度として最小固有値を使用する(minEigThreshold の説明を参照)。このフラグが設定されていない場合、元の点と移動後の点の周辺パッチ間の L1 距離をウィンドウ内のピクセル数で割った値が誤差尺度として使用される。
minEigThresholdアルゴリズムは、オプティカルフロー方程式の 2x2 正規行列(この行列は [38] では空間勾配行列と呼ばれる)の最小固有値を、ウィンドウ内のピクセル数で割った値を計算する。この値が minEigThreshold より小さい場合、対応する特徴はフィルタで除外され、そのフローは処理されない。これにより、悪い点を取り除いて性能を向上させることができる。

この関数は、ピラミッドにおける Lucas-Kanade オプティカルフローの疎な反復版を実装する。[38] を参照。この関数は TBB ライブラリで並列化されている。

覚え書き
いくつかの例:
  • Lucas-Kanade オプティカルフローアルゴリズムを使った例は opencv_source_code/samples/cpp/lkdemo.cpp にある
  • (Python) Lucas-Kanade オプティカルフローアルゴリズムを使った例は opencv_source_code/samples/python/lk_track.py にある
  • (Python) ホモグラフィマッチングに Lucas-Kanade トラッカーを使った例は opencv_source_code/samples/python/lk_homography.py にある

◆ CamShift()

RotatedRect cv::CamShift ( InputArray probImage,
Rect & window,
TermCriteria criteria )
Python:
cv.CamShift(probImage, window, criteria) -> retval, window

#include <opencv2/video/tracking.hpp>

オブジェクトの中心、サイズ、向きを求める。

引数
probImageオブジェクトヒストグラムの逆投影。calcBackProject を参照。
window初期探索ウィンドウ。
criteria内部の meanShift の停止条件。(旧インターフェースで)CAMSHIFT が収束するまでにかかった反復回数を返す。この関数はCAMSHIFTオブジェクト追跡アルゴリズム [41] を実装している。まず meanShift を使ってオブジェクトの中心を求め、続いてウィンドウサイズを調整して最適な回転を求める。この関数は、オブジェクトの位置・サイズ・向きを含む回転矩形構造体を返す。探索ウィンドウの次の位置は RotatedRect::boundingRect() で取得できる。

色付きオブジェクトを追跡する OpenCV サンプル camshiftdemo.c を参照。

覚え書き
  • (Python) camshift トラッキングアルゴリズムを説明するサンプルは opencv_source_code/samples/python/snippets/camshift.py にある

◆ computeECC()

double cv::computeECC ( InputArray templateImage,
InputArray inputImage,
InputArray inputMask = noArray() )
Python:
cv.computeECC(templateImage, inputImage[, inputMask]) -> retval

#include <opencv2/video/tracking.hpp>

2つの画像間の Enhanced Correlation Coefficient (ECC) 値を計算する。

Enhanced Correlation Coefficient (ECC) は、2つの画像間の類似度を正規化した尺度である [84]。結果は [-1, 1] の範囲にあり、1 は(アフィンシフトとスケールを除いた)完全な類似、0 は無相関、-1 は完全な負の相関に対応する。

シングルチャンネル画像の場合、ECC は次のように定義される:

\[ \mathrm{ECC}(I, T) = \frac{\sum_{x} (I(x) - \mu_I)(T(x) - \mu_T)} {\sqrt{\sum_{x} (I(x) - \mu_I)^2} \cdot \sqrt{\sum_{x} (T(x) - \mu_T)^2}} \]

マルチチャンネル画像(例: 3チャンネルRGB)の場合、式は次のように一般化される:

\[ \mathrm{ECC}(I, T) = \frac{\sum_{x} \sum_{c=1}^{C} (I_c(x) - \mu_{I_c})(T_c(x) - \mu_{T_c})} {\sqrt{\sum_{x} \sum_{c=1}^{C} (I_c(x) - \mu_{I_c})^2} \cdot \sqrt{\sum_{x} \sum_{c=1}^{C} (T_c(x) - \mu_{T_c})^2}} \]

ここで:

  • \(I_c(x), T_c(x)\) は空間位置 \(x\) におけるチャンネル \(c\) の値、
  • \(\mu_{I_c}, \mu_{T_c}\) は(指定された場合)マスク領域上におけるチャンネル \(c\) の平均値、
  • \(C\) はチャンネル数(現在は 1 と 3 のみサポート)、
  • 総和は画像領域内のすべてのピクセル \(x\) にわたって行われる(任意でマスクにより制限される)。
引数
templateImage入力テンプレート画像。1または3チャンネルで、型は CV_8U、CV_16U、CV_32F、CV_64F のいずれかでなければならない。
inputImageテンプレートと比較される入力画像。templateImage と同じ型・同じチャンネル数でなければならない。
inputMaskinputImage および templateImage における有効な関心領域(ROI)を指定する、省略可能なシングルチャンネルマスク。
戻り値
[-1, 1] の範囲のECC類似度係数。
参照
findTransformECC

◆ estimateRigidTransform()

Mat cv::estimateRigidTransform ( InputArray src,
InputArray dst,
bool fullAffine )

#include <opencv2/video/tracking.hpp>

2つの2D点集合間の最適なアフィン変換を計算する。

引数
srcstd::vector または Mat に格納された 1 つ目の入力 2 次元点集合、または Mat に格納された画像。
dstA と同じサイズ・同じ型の2つ目の入力2D点集合、または別の画像。
fullAffinetrue の場合、追加の制約なしに最適なアフィン変換を求める(自由度6)。そうでない場合、選択できる変換のクラスは、平行移動・回転・一様スケーリングの組み合わせに限定される(自由度4)。

この関数は、次の間のアフィン変換を最もよく近似する最適なアフィン変換 [A|b] (2 x 3 の浮動小数点行列)を求める:

Two point sets
Two raster images. In this case, the function first finds some features in the src image and
finds the corresponding features in dst image. After that, the problem is reduced to the first
case.

点集合の場合、問題は次のように定式化される: 2x2 行列 A と 2x1 ベクトル b を、次が成り立つように求める必要がある:

\[[A^*|b^*] = arg \min _{[A|b]} \sum _i \| \texttt{dst}[i] - A { \texttt{src}[i]}^T - b \| ^2\]

ここで src[i] と dst[i] はそれぞれ src と dst の i 番目の点である。\([A|b]\) は任意(fullAffine=true のとき)であるか、または次の形式をとる

\[\begin{bmatrix} a_{11} & a_{12} & b_1 \\ -a_{12} & a_{11} & b_2 \end{bmatrix}\]

fullAffine=false のとき。

非推奨Deprecated
代わりに cv::estimateAffine2Dcv::estimateAffinePartial2D を使う。この関数を画像に対して使う場合は、cv::calcOpticalFlowPyrLK で点を抽出してから推定関数を使う。
参照
estimateAffine2D, estimateAffinePartial2D, getAffineTransform, getPerspectiveTransform, findHomography

◆ findTransformECC() [1/2]

double cv::findTransformECC ( InputArray templateImage,
InputArray inputImage,
InputOutputArray warpMatrix,
int motionType,
TermCriteria criteria,
InputArray inputMask,
int gaussFiltSize )
Python:
cv.findTransformECC(templateImage, inputImage, warpMatrix, motionType, criteria, inputMask, gaussFiltSize) -> retval, warpMatrix
cv.findTransformECC(templateImage, inputImage, warpMatrix[, motionType[, criteria[, inputMask]]]) -> retval, warpMatrix

#include <opencv2/video/tracking.hpp>

ECC基準による2つの画像間の幾何変換(ワープ)を求める [84]

引数
templateImage1または3チャンネルのテンプレート画像。CV_8U、CV_16U、CV_32F、CV_64F 型。
inputImagetemplateImage と似た画像を得るために、最終的な warpMatrix でワープされるべき入力画像。templateImage と同じ型。
warpMatrix浮動小数点の \(2\times 3\) または \(3\times 3\) のマッピング行列(ワープ)。
motionType動きの種類を指定する引数:
  • MOTION_TRANSLATION 平行移動の動きモデルを設定する。warpMatrix は \(2\times 3\) で、最初の \(2\times 2\) 部分が単位行列、残りの2つの引数が推定される。
  • MOTION_EUCLIDEAN ユークリッド(剛体)変換を動きモデルとして設定する。3つの引数が推定され、warpMatrix は \(2\times 3\) である。
  • MOTION_AFFINE アフィン動きモデルを設定する(デフォルト)。6つの引数が推定され、warpMatrix は \(2\times 3\) である。
  • MOTION_HOMOGRAPHY ホモグラフィを動きモデルとして設定する。8つの引数が推定され、`warpMatrix` は \(3\times 3\) である。
criteriaECCアルゴリズムの終了条件を指定する引数。criteria.epsilon は2回の反復間の相関係数の増分のしきい値を定義する(負の criteria.epsilon にすると criteria.maxcount が唯一の終了条件となる)。デフォルト値は上記の宣言に示されている。
inputMaskinputImage の有効な値を示す、省略可能なシングルチャンネルマスク。
gaussFiltSizeガウシアンブラーフィルタのサイズを示す省略可能な値。(デフォルト: 5)

この関数は、ECC基準([84])に関して最適な変換(warpMatrix)を推定する。すなわち

\[\texttt{warpMatrix} = \arg\max_{W} \texttt{ECC}(\texttt{templateImage}(x,y),\texttt{inputImage}(x',y'))\]

ここで

\[\begin{bmatrix} x' \\ y' \end{bmatrix} = W \cdot \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}\]

(ホモグラフィの場合、この式は同次座標で成り立つ)。最終的な強調相関係数、すなわちテンプレート画像と最終的にワープされた入力画像との相関係数を返す。motionType =0, 1, 2 で \(3\times 3\) 行列が与えられた場合、3行目は無視される。

findHomography や estimateRigidTransform とは異なり、findTransformECC は輝度の類似性に基づく領域ベースのアライメントを実装する。本質的には、画像を大まかに整合させる初期変換を更新する。この情報が欠けている場合は、恒等ワープ(単位行列)が初期値として使われる。画像が大きな変位/回転を受ける場合は、画像を大まかに整合させる初期変換が必要であることに注意(例えば、画像がほぼ同じ内容を表すようにする単純なユークリッド/相似変換)。2番目の画像に逆ワープを使って1番目に近い画像を得る、すなわち warpAffine や warpPerspective とともに WARP_INVERSE_MAP フラグを使用する。この関数の使い方を示す OpenCV サンプル image_alignment.cpp も参照。アルゴリズムが収束しない場合、この関数は例外をスローすることに注意。

参照
computeECC, estimateAffine2D, estimateAffinePartial2D, findHomography

◆ findTransformECC() [2/2]

double cv::findTransformECC ( InputArray templateImage,
InputArray inputImage,
InputOutputArray warpMatrix,
int motionType = MOTION_AFFINE,
TermCriteria criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 50, 0.001),
InputArray inputMask = noArray() )
Python:
cv.findTransformECC(templateImage, inputImage, warpMatrix, motionType, criteria, inputMask, gaussFiltSize) -> retval, warpMatrix
cv.findTransformECC(templateImage, inputImage, warpMatrix[, motionType[, criteria[, inputMask]]]) -> retval, warpMatrix

#include <opencv2/video/tracking.hpp>

これは利便性のために提供されているオーバーロードされたメンバ関数である。上記の関数とは、受け取る引数のみが異なる。

◆ findTransformECCMultiScale()

double cv::findTransformECCMultiScale ( InputArray reference,
InputArray sample,
InputOutputArray warpMatrix,
const ECCParameters & eccParams = ECCParameters(),
InputArray referenceMask = noArray(),
InputArray sampleMask = noArray() )
Python:
cv.findTransformECCMultiScale(reference, sample, warpMatrix[, eccParams[, referenceMask[, sampleMask]]]) -> retval, warpMatrix

#include <opencv2/video/tracking.hpp>

ECC 基準 [84] に基づいて、2 つの画像間の幾何学的変換(ワープ)を求める。ピラミッドを使用する。

引数
referenceシングルチャンネルの参照画像。CV_8U, CV_16U, CV_32F, CV_64F 型。
sample参照画像に類似した画像を得るために、最終的な warpMatrix でワープされるべきサンプル画像。参照画像と同じ型。
warpMatrix浮動小数点の \(2\times 3\) または \(3\times 3\) のマッピング行列(ワープ)。
eccParamsアルゴリズムの引数のリスト。詳細は ECCParameters を参照。
referenceMask参照画像の有効な値を示す省略可能なシングルチャンネルのマスク。
sampleMaskサンプル画像の有効な値を示す省略可能なシングルチャンネルのマスク。

この関数は、ECC基準([84])に関して最適な変換(warpMatrix)を推定する。すなわち

\[\texttt{warpMatrix} = \arg\max_{W} \texttt{ECC}(\texttt{templateImage}(x,y),\texttt{inputImage}(x',y'))\]

ここで

\[\begin{bmatrix} x' \\ y' \end{bmatrix} = W \cdot \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}\]

(ホモグラフィの場合、この式は同次座標で成り立つ)。最終的な強調相関係数、すなわちテンプレート画像と最終的にワープされた入力画像との相関係数を返す。motionType =0, 1, 2 で \(3\times 3\) 行列が与えられた場合、3行目は無視される。

findHomography や estimateRigidTransform とは異なり、findTransformECCMultiScale 関数は輝度の類似性に基づく領域ベースの位置合わせを実装している。本質的には、この関数は画像をおおまかに位置合わせする初期変換を更新する。この情報が指定されていない場合は、恒等ワープ(単位行列)が初期値として使われる。画像が大きな移動や回転を伴う場合は、画像をおおまかに位置合わせする初期変換が必要となることに注意(例えば、同じ画像内容をおおよそ示す画像を可能にする単純なユークリッド変換/相似変換など)。2 番目の画像に対して逆ワープを使うことで、1 番目の画像に近い画像を得る。すなわち、warpAffine または warpPerspective とともに WARP_INVERSE_MAP フラグを使う。この関数の使用例を示す OpenCV のサンプル image_alignment.cpp も参照。アルゴリズムが収束しない場合、この関数は例外をスローすることに注意。findTransformECC とは異なり、findTransformECCMultiScale はピラミッドを使うため、関数がより安定し、より複雑なケースを正しく扱えるようになる。

参照
computeECC, estimateAffine2D, estimateAffinePartial2D, findHomography

◆ findTransformECCWithMask()

double cv::findTransformECCWithMask ( InputArray templateImage,
InputArray inputImage,
InputArray templateMask,
InputArray inputMask,
InputOutputArray warpMatrix,
int motionType = MOTION_AFFINE,
TermCriteria criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 50, 1e-6),
int gaussFiltSize = 5 )
Python:
cv.findTransformECCWithMask(templateImage, inputImage, templateMask, inputMask, warpMatrix[, motionType[, criteria[, gaussFiltSize]]]) -> retval, warpMatrix

#include <opencv2/video/tracking.hpp>

テンプレート画像と入力画像の両方に対する有効性マスクを用いて、ECC基準による2つの画像間の幾何変換(ワープ)を求める [84]

この関数は、テンプレート画像のマスクを追加することで findTransformECC() を拡張する。Enhanced Correlation Coefficient は両方の画像で有効なピクセルに対してのみ評価される。各反復で inputMask はテンプレートフレームへワープされ templateMask と結合され、これらのマスクの共通部分のみが目的関数に寄与する。

引数
templateImage1または3チャンネルのテンプレート画像。CV_8U、CV_16U、CV_32F、CV_64F 型。
inputImagetemplateImage と似た画像を得るために、最終的な warpMatrix でワープされるべき入力画像。templateImage と同じ型。
templateMask位置合わせに使用する有効なピクセルを示す、templateImage 用のシングルチャンネル8ビットマスク。templateImage と同じサイズでなければならない。
inputMaskワーピング前のinputImageの有効ピクセルを示すシングルチャンネル8ビットマスク。inputImageと同じサイズでなければならない。
warpMatrix浮動小数点の \(2\times 3\) または \(3\times 3\) のマッピング行列(ワープ)。
motionType動きの種類を指定する引数:
  • MOTION_TRANSLATION は平行移動の動きモデルを設定する。warpMatrix は \(2\times 3\) で、最初の \(2\times 2\) の部分が単位行列、残りの2つの引数が推定される。
  • MOTION_EUCLIDEAN はユークリッド(剛体)変換を動きモデルとして設定する。3つの引数が推定され、warpMatrix は \(2\times 3\) である。
  • MOTION_AFFINE はアフィン動きモデル(デフォルト)を設定する。6つの引数が推定され、warpMatrix は \(2\times 3\) である。
  • MOTION_HOMOGRAPHY はホモグラフィを動きモデルとして設定する。8つの引数が推定され、warpMatrix は \(3\times 3\) である。
criteriaECCアルゴリズムの終了条件を指定する引数。criteria.epsilon は2回の反復間の相関係数の増分のしきい値を定義する(負の criteria.epsilon にすると criteria.maxcount が唯一の終了条件となる)。デフォルト値は上記の宣言に示されている。
gaussFiltSizeアライメントを計算する前に画像とマスクを平滑化するために使われるガウシアンブラーフィルタのサイズ(デフォルト: 5)。
参照
findTransformECC, computeECC, estimateAffine2D, estimateAffinePartial2D, findHomography

◆ meanShift()

int cv::meanShift ( InputArray probImage,
Rect & window,
TermCriteria criteria )
Python:
cv.meanShift(probImage, window, criteria) -> retval, window

#include <opencv2/video/tracking.hpp>

バックプロジェクション画像上のオブジェクトを求める。

引数
probImageオブジェクトヒストグラムのバックプロジェクション。詳細は calcBackProject を参照。
window初期探索ウィンドウ。
criteria反復探索アルゴリズムの停止条件。戻り値: CAMSHIFT が収束するまでにかかった反復回数。この関数は反復オブジェクト探索アルゴリズムを実装する。オブジェクトの入力バックプロジェクションと初期位置を受け取る。バックプロジェクション画像のウィンドウ内の質量中心が計算され、探索ウィンドウの中心が質量中心へシフトする。この手順は、指定された反復回数 criteria.maxCount に達するか、ウィンドウ中心のシフトが criteria.epsilon 未満になるまで繰り返される。このアルゴリズムは CamShift の内部で使われるが、CamShift とは異なり、探索中に探索ウィンドウのサイズや向きは変化しない。calcBackProject の出力をそのままこの関数に渡せばよい。ただし、バックプロジェクションを事前にフィルタリングしてノイズを除去すれば、より良い結果が得られる。例えば、findContours で連結成分を取得し、面積の小さい輪郭を( contourArea で)除去し、残った輪郭を drawContours で描画することでこれを行える。

◆ readOpticalFlow()

Mat cv::readOpticalFlow ( const String & path)
Python:
cv.readOpticalFlow(path) -> retval

#include <opencv2/video/tracking.hpp>

.flo ファイルを読み込む。

引数
path読み込むファイルへのパス

readOpticalFlow 関数はファイルからフローフィールドを読み込み、それを単一の行列として返す。返される Mat は CV_32FC2 型(浮動小数点、2 チャンネル)を持つ。1 番目のチャンネルは水平方向のフロー (u)、2 番目は垂直方向 (v) に対応する。

◆ writeOpticalFlow()

bool cv::writeOpticalFlow ( const String & path,
InputArray flow )
Python:
cv.writeOpticalFlow(path, flow) -> retval

#include <opencv2/video/tracking.hpp>

.flo をディスクに書き込む。

引数
path書き込むファイルへのパス
flow保存するフローフィールド

関数はフローフィールドをファイルに保存し、成功時に true、それ以外は false を返す。フローフィールドは2チャンネルの浮動小数点行列(CV_32FC2)でなければならない。第1チャンネルは水平方向(u)のフローに対応し、第2チャンネルは垂直方向(v)に対応する。