OpenCV  4.10.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::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() 函数的中文翻译。

◆ calcOpticalFlowFarneback() ( InputArray  prev,
InputArray  next,
输入输出数组  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 应设置为一个更大的值以达到相同的鲁棒性级别。

函数使用 [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 ( InputArray  prevImg,
InputArray  nextImg,
InputArray  prevPts,
输入输出数组  nextPts,
输出数组  status,
输出数组  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输出错误向量;向量的每个元素都设置为对应特征的错误,错误度量类型可以在标志参数中设置;如果未找到流,则错误未定义(使用状态参数查找此类情况)。
winSize每个金字塔层上搜索窗口的大小。
maxLevel基于0的最大金字塔级别编号;如果设置为0,则不使用金字塔(单层),如果设置为1,则使用两层,以此类推;如果将金字塔传递到输入,则算法将使用金字塔的层数,但不超过 maxLevel。
标准参数,指定迭代搜索算法的终止标准(在指定最大迭代次数 criteria.maxCount 之后或在搜索窗口移动小于 criteria.epsilon 之后)。
flags操作标志
  • OPTFLOW_USE INITIALFLOW 使用在 nextPts 中存储的初始估计;如果没有设置此标志,则将 prevPts 复制到 nextPts,并将其视为初始估计。
  • OPTFLOW_LK_GET MINEigen VALS 使用最小特征值作为误差度量(请参阅 minEigThreshold 说明);如果不设置此标志,则使用原始点周围移动点修补之间的 L1 距离(请参阅 L1 距离的定义),并将其除以窗口中的像素数,作为误差度量。
minEig Threshold算法计算光学流方程 2x2 正常矩阵的最小特征值(此矩阵在[36]中称为空间梯度矩阵),除以窗口中的像素数;如果此值小于 minEigThreshold,则筛选出相应的特征,并且不处理其流,因此可以删除坏点并获得性能提升。

该函数在金字塔中实现 Lucas-Kanade 光学流的稀疏迭代版本。请参阅[36]。使用 TBB 库对函数进行了并行化。

注意
一些示例
  • 在 opencv_source_code/samples/cpp/lkdemo.cpp 中可以找到使用 Lucas-Kanade 光学流算法的示例。
  • 在 opencv_source_code/samples/python/lk_track.py 中可以找到使用 Lucas-Kanade 光学流算法的示例(Python)。
  • 在 opencv_source_code/samples/python/lk_homography.py 中可以找到使用 Lucas-Kanade 追踪器进行单应性匹配的示例(Python)。

◆  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初始搜索窗口。
标准底层 meanShift 的停止标准。返回(在旧接口中)CAMSHIFT 收敛所需的迭代次数。该函数实现 CAMSHIFT 对象跟踪算法 [39]。首先,它使用 meanShift 找到对象中心,然后调整窗口大小并找到最佳旋转。函数返回包含对象位置、大小和方向的旋转矩形结构。可以通过RotatedRect::boundingRect() 获得下一个搜索窗口的位置。

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

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

◆  computeECC

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

#include <opencv2/video/tracking.hpp>

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

参数
templateImage单通道模板图像;CV_8U或CV_32F数组。
inputImage需要变形为与templateImage相似的图像的单通道输入图像。
inputMask可选的掩码,用于指示inputImage的有效值。
参见
findTransformECC

◆ estimateRigidTransform()

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

#include <opencv2/video/tracking.hpp>

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

参数
src第一个输入2D点集存储在std::vector或Mat中,或存储在Mat中的图像。
dst与A大小和类型相同的第二个输入2D点集,或另一个图像。
fullAffine如果为true,则函数寻找没有额外的限制(有6个自由度)的最优仿射变换。否则,选择的变换类仅限于平移、旋转和统一缩放的组合(有4个自由度)。

函数寻找最优仿射变换 [A|b](一个2x3的单精度浮点矩阵),以最佳逼近以下两点集之间的仿射变换:

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 ( InputArray  templateImage,
InputArray  inputImage,
输入输出数组  warpMatrix,
int  motionType,
TermCriteria  标准,
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标准 [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\)。
标准参数,指定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 ( InputArray  templateImage,
InputArray  inputImage,
输入输出数组  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初始搜索窗口。
标准迭代搜索算法的停止标准。返回:CAMSHIFT 收敛所需的迭代次数。该函数实现了迭代目标搜索算法。它接收物体的反向投影和初始位置作为输入。计算反向投影图像窗口内的质量中心,并将搜索窗口中心移动到质量中心。重复此过程,直到指定次数 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,
InputArray  flow 
)
Python
cv.writeOpticalFlow(path, flow) -> retval

#include <opencv2/video/tracking.hpp>

将 .flo 写入磁盘。

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

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