OpenCV 4.12.0
开源计算机视觉
加载中...
搜索中...
无匹配项
目标跟踪

详细描述

类  cv::DenseOpticalFlow
 
类  cv::DISOpticalFlow
 DIS 光流算法。 更多...
 
类  cv::FarnebackOpticalFlow
 使用 Gunnar Farneback 算法计算稠密光流的类。 更多...
 
类  cv::KalmanFilter
 卡尔曼滤波器类。 更多...
 
类  cv::SparseOpticalFlow
 稀疏光流算法的基接口。 更多...
 
类  cv::SparsePyrLKOpticalFlow
 用于计算稀疏光流的类。 更多...
 
类  cv::Tracker
 长期跟踪器的基抽象类。 更多...
 
类  cv::TrackerDaSiamRPN
 
类  cv::TrackerGOTURN
 GOTURN(使用回归网络的通用对象跟踪)跟踪器 更多...
 
类  cv::TrackerMIL
 MIL 算法以在线方式训练分类器,以将对象与背景分离。 更多...
 
类  cv::TrackerNano
 Nano 跟踪器是一种超轻量级基于 DNN 的通用对象跟踪器。 更多...
 
类  cv::TrackerVit
 VIT 跟踪器是一种超轻量级基于 DNN 的通用对象跟踪器。 更多...
 
类  cv::VariationalRefinement
 变分光流细化。 更多...
 

枚举

枚举  {
  cv::OPTFLOW_USE_INITIAL_FLOW = 4 ,
  cv::OPTFLOW_LK_GET_MIN_EIGENVALS = 8 ,
  cv::OPTFLOW_FARNEBACK_GAUSSIAN = 256
}
 
枚举  {
  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)
 Finds an object center, size, and orientation.
 
double cv::computeECC (InputArray templateImage, InputArray inputImage, InputArray inputMask=noArray())
 计算两幅图像之间的增强相关系数(ECC)值 [82]
 
Mat cv::estimateRigidTransform (InputArray src, InputArray dst, bool fullAffine)
 计算两个二维点集之间的最佳仿射变换。
 
double cv::findTransformECC (InputArray templateImage, InputArray inputImage, InputOutputArray warpMatrix, int motionType, TermCriteria criteria, InputArray inputMask, int gaussFiltSize)
 根据 ECC 准则 [82] 寻找两幅图像之间的几何变换(扭曲)。
 
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())
 
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 写入磁盘。
 

枚举类型文档

◆ 匿名枚举

匿名枚举

#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

◆ 匿名枚举

匿名枚举

#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 参数。需要它来计算金字塔层所需的填充。
maxLevel基于 0 的最大金字塔层数。
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 算法计算稠密光流。

参数
prev第一个 8 位单通道输入图像。
next (下一个)与 prev 相同大小和类型的第二个输入图像。
flow计算出的流图像,其大小与 prev 相同,类型为 CV_32FC2。
pyr_scale参数,指定用于为每个图像构建金字塔的图像比例(<1);pyr_scale=0.5 表示经典金字塔,其中每一层都比前一层小两倍。
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 应设置为更大的值以达到相同的鲁棒性水平。

该函数使用 [84] 算法为每个 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 方法计算稀疏特征集的光流。

参数
prevImg第一个 8 位输入图像或由 buildOpticalFlowPyramid 构建的金字塔。
nextImg第二个输入图像或与 prevImg 大小和类型相同的金字塔。
prevPts需要寻找光流的二维点向量;点坐标必须是单精度浮点数。
nextPts输出的二维点向量(包含单精度浮点坐标),其中包含第二幅图像中输入特征的计算新位置;当传递 OPTFLOW_USE_INITIAL_FLOW 标志时,该向量必须与输入的大小相同。
status输出状态向量(无符号字符);如果找到相应特征的光流,向量的每个元素设置为 1,否则设置为 0。
err输出误差向量;向量的每个元素设置为相应特征的误差,误差度量的类型可以在 flags 参数中设置;如果未找到光流,则误差未定义(使用 status 参数查找此类情况)。
winSize每个金字塔级别的搜索窗口大小。
maxLevel基于 0 的最大金字塔层数;如果设置为 0,则不使用金字塔(单层),如果设置为 1,则使用两层,依此类推;如果金字塔作为输入传递,则算法将使用金字塔拥有的层数,但不超过 maxLevel。
criteria参数,指定迭代搜索算法的终止标准(在达到指定的最大迭代次数 criteria.maxCount 后,或当搜索窗口移动小于 criteria.epsilon 时)。
flags操作标志
  • OPTFLOW_USE_INITIAL_FLOW 使用存储在 nextPts 中的初始估计;如果未设置此标志,则 prevPts 将复制到 nextPts 并被视为初始估计。
  • OPTFLOW_LK_GET_MIN_EIGENVALS 使用最小特征值作为误差度量(参见 minEigThreshold 描述);如果未设置此标志,则使用原始点和移动点周围补丁之间的 L1 距离,除以窗口中的像素数,作为误差度量。
minEigThreshold该算法计算光流方程的 2x2 法线矩阵(该矩阵在 [37] 中称为空间梯度矩阵)的最小特征值,然后除以窗口中的像素数;如果此值小于 minEigThreshold,则相应的特征将被过滤掉且其光流不被处理,因此这允许移除坏点并获得性能提升。

该函数实现了金字塔中 Lucas-Kanade 光流的稀疏迭代版本。参见 [37] 。该函数使用 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>

Finds an object center, size, and orientation.

参数
probImage对象直方图的反向投影。参见 calcBackProject。
window初始搜索窗口。
criteria底层 meanShift 的停止标准。返回(在旧接口中)CAMSHIFT 收敛所需的迭代次数。该函数实现了 CAMSHIFT 对象跟踪算法 [40] 。首先,它使用 meanShift 找到对象中心,然后调整窗口大小并找到最佳旋转。该函数返回包含对象位置、大小和方向的旋转矩形结构。搜索窗口的下一个位置可以通过 RotatedRect::boundingRect() 获取。

请参见 OpenCV 示例 camshiftdemo.c,该示例跟踪彩色对象。

注意
  • (Python)一个解释 camshift 跟踪算法的示例可以在 opencv_source_code/samples/python/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>

计算两幅图像之间的增强相关系数(ECC)值 [82]

参数
templateImage单通道模板图像;CV_8U 或 CV_32F 数组。
inputImage要扭曲的单通道输入图像,以提供与 templateImage 相似的图像,类型与 templateImage 相同。
inputMask一个可选掩码,用于指示 inputImage 的有效值。
另请参见
findTransformECC

◆ estimateRigidTransform()

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

#include <opencv2/video/tracking.hpp>

计算两个二维点集之间的最佳仿射变换。

参数
src第一个输入二维点集,存储在 std::vector 或 Mat 中,或者存储在 Mat 中的图像。
dst第二个输入二维点集,与 A 的大小和类型相同,或者是另一幅图像。
fullAffine如果为 true,该函数会找到没有额外限制的最佳仿射变换(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 时。

已弃用
请改用 cv::estimateAffine2D, cv::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 准则 [82] 寻找两幅图像之间的几何变换(扭曲)。

参数
templateImage单通道模板图像;CV_8U 或 CV_32F 数组。
inputImage单通道输入图像,应使用最终的 warpMatrix 进行扭曲,以提供与 templateImage 相似的图像,类型与 templateImage 相同。
warpMatrix浮点 \(2\times 3\) 或 \(3\times 3\) 映射矩阵(扭曲)。
motionType参数,指定运动类型
  • MOTION_TRANSLATION 设置平移运动模型;warpMatrix 为 \(2\times 3\) 矩阵,其中前 \(2\times 2\) 部分是单位矩阵,其余两个参数被估计。
  • MOTION_EUCLIDEAN 设置欧几里得(刚性)变换作为运动模型;估计三个参数;warpMatrix 为 \(2\times 3\)。
  • MOTION_AFFINE 设置仿射运动模型(默认);估计六个参数;warpMatrix 为 \(2\times 3\)。
  • MOTION_HOMOGRAPHY 设置单应性作为运动模型;估计八个参数;`warpMatrix` 为 \(3\times 3\)。
criteria参数,指定 ECC 算法的终止标准;criteria.epsilon 定义两次迭代之间相关系数增量的阈值(负的 criteria.epsilon 使 criteria.maxcount 成为唯一的终止标准)。默认值如上述声明所示。
inputMask一个可选掩码,用于指示 inputImage 的有效值。
gaussFiltSize一个可选值,指示高斯模糊滤波器的大小;(默认值:5)

该函数根据 ECC 准则 ([82]) 估计最佳变换 (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}\]

(对于单应性,该方程在齐次坐标下成立)。它返回最终的增强相关系数,即模板图像与最终扭曲输入图像之间的相关系数。当给定一个 \(3\times 3\) 矩阵且 motionType =0、1 或 2 时,第三行将被忽略。

与 findHomography 和 estimateRigidTransform 不同,函数 findTransformECC 实现了一种基于区域的对齐,该对齐基于强度相似性。本质上,该函数更新大致对齐图像的初始变换。如果缺少此信息,则使用单位扭曲(单位矩阵)作为初始化。请注意,如果图像发生强烈位移/旋转,则需要一个大致对齐图像的初始变换(例如,一个简单的欧几里得/相似变换,允许图像大致显示相同图像内容)。在第二幅图像中使用反向扭曲,使其接近第一幅图像,即在使用 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>

这是一个重载成员函数,为方便起见而提供。它与上述函数的区别仅在于它接受的参数不同。

◆ 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 & 路径)
Python
cv.readOpticalFlow(路径) -> retval

#include <opencv2/video/tracking.hpp>

读取 .flo 文件。

参数
路径要加载的文件路径

函数 readOpticalFlow 从文件中加载流场并将其作为单个矩阵返回。结果 Mat 的类型为 CV_32FC2 - 浮点,2 通道。第一个通道对应水平方向的流 (u),第二个通道对应垂直方向的流 (v)。

◆ writeOpticalFlow()

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

#include <opencv2/video/tracking.hpp>

将 .flo 写入磁盘。

参数
路径要写入的文件路径
flow要存储的流场

该函数将流场存储到文件中,成功返回 true,否则返回 false。流场必须是 2 通道浮点矩阵 (CV_32FC2)。第一个通道对应水平方向的流 (u),第二个通道对应垂直方向的流 (v)。