OpenCV 4.11.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)
 查找目标中心、大小和方向。
 
double cv::computeECC (InputArray templateImage, InputArray inputImage, InputArray inputMask=noArray())
 计算两幅图像之间的增强相关系数值 [80]
 
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准则查找两幅图像之间的几何变换(扭曲) [80]
 
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 ( 输入数组 img,
输出数组数组 pyramid,
尺寸 winSize,
整数 maxLevel,
布尔值 withDerivatives = true,
整数 pyrBorder = BORDER_REFLECT_101,
整数 derivBorder = BORDER_CONSTANT,
布尔值 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 ( 输入数组 prev,
输入数组 next,
输入输出数组 flow,
双精度浮点数 pyr_scale,
整数 levels,
整数 winsize,
整数 iterations,
整数 poly_n,
双精度浮点数 poly_sigma,
整数 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应设置为较大的值以实现相同级别的鲁棒性。

该函数使用[82]算法为每个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 ( 输入数组 prevImg,
输入数组 nextImg,
输入数组 prevPts,
输入输出数组 nextPts,
输出数组 status,
输出数组 err,
尺寸 winSize = Size(21, 21),
整数 maxLevel = 3,
终止准则 criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01),
整数 flags = 0,
双精度浮点数 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 正规矩阵的最小特征值(此矩阵在 [36] 中称为空间梯度矩阵),除以窗口中的像素数;如果此值小于 minEigThreshold,则过滤掉相应的特征,并且不处理其流,因此可以去除坏点并提高性能。

该函数实现了金字塔中 Lucas-Kanade 光流的稀疏迭代版本。参见 [36]。该函数使用 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 ( 输入数组 probImage,
Rect & window,
终止准则 criteria )
Python
cv.CamShift(probImage, window, criteria) -> retval, window

#include <opencv2/video/tracking.hpp>

查找目标中心、大小和方向。

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

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

注意
  • (Python) 解释 camshift 跟踪算法的示例可在 opencv_source_code/samples/python/camshift.py 中找到。

◆ computeECC()

double cv::computeECC ( 输入数组 templateImage,
输入数组 inputImage,
输入数组 inputMask = noArray() )
Python
cv.computeECC(templateImage, inputImage[, inputMask]) -> retval

#include <opencv2/video/tracking.hpp>

计算两幅图像之间的增强相关系数值 [80]

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

◆ estimateRigidTransform()

Mat cv::estimateRigidTransform ( 输入数组 src,
输入数组 dst,
布尔值 fullAffine )

#include <opencv2/video/tracking.hpp>

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

参数
src存储在 std::vector 或 Mat 中的第一个输入 2D 点集,或存储在 Mat 中的图像。
dst第二个输入 2D 点集,大小和类型与 A 相同,或另一个图像。
fullAffine如果为真,则函数找到没有附加限制的最佳仿射变换(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::estimateAffine2Dcv::estimateAffinePartial2D 代替。如果你将此函数与图像一起使用,请使用 cv::calcOpticalFlowPyrLK 提取点,然后使用估计函数。
另见
estimateAffine2DestimateAffinePartial2DgetAffineTransformgetPerspectiveTransformfindHomography

◆ findTransformECC() [1/2]

double cv::findTransformECC ( 输入数组 templateImage,
输入数组 inputImage,
输入输出数组 warpMatrix,
整数 motionType,
终止准则 criteria,
输入数组 inputMask,
整数 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准则查找两幅图像之间的几何变换(扭曲) [80]

参数
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 准则 ([80]) 估计最佳变换 (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,该示例演示了该函数的用法。请注意,如果算法不收敛,则该函数会抛出异常。

另见
computeECCestimateAffine2DestimateAffinePartial2DfindHomography

◆ findTransformECC() [2/2]

double cv::findTransformECC ( 输入数组 templateImage,
输入数组 inputImage,
输入输出数组 warpMatrix,
整数 motionType = MOTION_AFFINE,
终止准则 criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 50, 0.001),
输入数组 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 ( 输入数组 probImage,
Rect & window,
终止准则 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 通道。第一通道对应于水平方向(u)的流,第二通道对应于垂直方向(v)的流。

◆ writeOpticalFlow()

bool cv::writeOpticalFlow ( const String & path,
输入数组 flow )
Python
cv.writeOpticalFlow(path, flow) -> retval

#include <opencv2/video/tracking.hpp>

将.flo写入磁盘。

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

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