OpenCV中使用金字塔LK光流法(上)

        有关金字塔LK光流法的原理,可参考这篇文章金字塔LK光流法数学原理学习笔记_lk光流 论文-优快云博客。这里我们讲解OpenCV中实现的金字塔LK光流法的相关API,并通过一个demo来学习如何使用它。

        首先介绍一些API,它们是光流法流程中会用到的功能函数,之后再介绍calcOpticalFlowPyrLK()。

1. cornerHarris()


void cv::cornerHarris	(	InputArray 	src,
OutputArray 	dst,
int 	blockSize,
int 	ksize,
double 	k,
int 	borderType = BORDER_DEFAULT 
)		
Python:
dst	=	cv.cornerHarris(	src, blockSize, ksize, k[, dst[, borderType]]	)

    

1.1. 功能

        Harris角点检测

1.2. 原理

        具体可参考Harris角点检测学习_harris角点检测 相关性-优快云博客。该方法针对输入图像做Harris角点检测,针对每个像素它会计算一个区间内(blockSize*blockSize)的2*2的协方差矩阵M(x,y),然后根据下面的公式计算得到一个响应值。

        每个点都计算得到一个响应值,对所有的响应值搜索局部极大值,将对应的点作为角点。

1.3. 参数

  • src:输入的8bit单通道或者浮点型图像
  • dst:保存Harris检测器的响应值矩阵,类型为CV_32FC1且尺寸与输入图一致
  • blockSize:计算协方差矩阵时的区域大小
  • ksize:Sobel算子的核尺寸,用于得到图像沿x/y方向的梯度
  • k:对应上述公式的系数
  • borderType:图像扩展类型,见BorderTypes数据类型

2. cornerEigenValsAndVecs()

void cv::cornerEigenValsAndVecs	(	InputArray 	src,
OutputArray 	dst,
int 	blockSize,
int 	ksize,
int 	borderType = BORDER_DEFAULT 
)		
Python:
dst	=	cv.cornerEigenValsAndVecs(	src, blockSize, ksize[, dst[, borderType]]	)

2.1. 功能

        计算图像块的特征值和特征向量,可用于后续的角点检测。

2.2. 原理

        对于每个像素,它会考虑一个邻域内(blockSize*blockSize)的子块S(p),然后按照如下公式计算协方差矩阵。其中通过Sobel算子来计算图像梯度。

        之后计算M的特征值和特征向量,以(λ1,λ2,x1,y1,x2,y2) 的格式保存到目标图像中,其中

  • λ1,λ2是特征值
  • x1,y1是对应λ1的特征向量
  • x2,y2是对应λ2的特征向量

        输出的数据可用于边缘或角点检测。

2.3. 参数

  • src:输入的8bit单通道或者浮点型图像
  • dst:保存特征值和特征向量的矩阵,类型为CV_32FC(6)且尺寸与输入图一致
  • blockSize:计算协方差矩阵时的子图区域大小
  • ksize:Sobel算子的核尺寸,用于得到图像沿x/y方向的梯度
  • borderType:图像扩展类型,见BorderTypes数据类型

3. cornerMinEigenVal()

void cv::cornerMinEigenVal	(	InputArray 	src,
OutputArray 	dst,
int 	blockSize,
int 	ksize = 3,
int 	borderType = BORDER_DEFAULT 
)		
Python:
dst	=	cv.cornerMinEigenVal(	src, blockSize[, dst[, ksize[, borderType]]]	)

3.1. 功能

        对梯度矩阵计算得到对应的较小的那个特征值,用于角点检测。

3.2. 原理

        与cornerEigenValsAndVecs()相似,但只计算和保存协方差矩阵的较小的特征值,即min(λ1,λ2)

3.3. 参数

  • src:输入的8bit单通道或者浮点型图像
  • dst:保存特征值的矩阵,类型为CV_32FC1且尺寸与输入图一致
  • blockSize:计算协方差矩阵时的子图区域大小
  • ksize:Sobel算子的核尺寸,用于得到图像沿x/y方向的梯度
  • borderType:图像扩展类型,见BorderTypes数据类型

4. goodFeaturesToTrack()

void cv::goodFeaturesToTrack	(	InputArray 	image,
OutputArray 	corners,
int 	maxCorners,
double 	qualityLevel,
double 	minDistance,
InputArray 	mask = noArray(),
int 	blockSize = 3,
bool 	useHarrisDetector = false,
double 	k = 0.04 
)	

4.1. 功能

        检测图像中的“好”角点

4.2. 原理

        寻找图像中最重要的角点,步骤包括

  • 使用cornerMinEigenVal()或者cornerHarris()方法计算每个像素的响应值
  • 对上述结果执行非极大值抑制,默认保留3x3区域内的极大值
  • 小于设定值的响应值被滤除
  • 对剩下的角点按照响应值降序排列
  • 舍弃掉设定范围内较小响应值的那个角点

        注意:如果分别设置参数qualityLevel为A和B且A>B并调用两次接口,则得到的结果向量中A对应的结果是B对应结果的前一部分子集。

4.3. 参数

  • image:输入的8bit整形或者32bit浮点型单通道图像
  • corners:输出的角点信息
  • maxCorners:允许返回角点数量的最大值。如果计算得到的角点数量大于该值,则返回其中更加重要的角点。maxCorners<=0意味着所有检测到的角点都被返回。
  • qualityLevel:用于设置角点响应值的阈值,用它乘以角点响应值的最大值(当使用cornerMinEigenVal()时对应着较小的特征值,当使用cornerHarris()时对应着Harris方程响应值)。响应值小于该值的角点会被滤除。举个例子,角点的最高响应值为1500,设置qualityLevel为0.01,那么响应值小于15的角点会被滤除。
  • minDistance:返回的角点之间最小的欧式距离,单位为像素
  • mask:用于控制执行角点检测的图像区域,格式为CV_8UC1且与输入图像尺寸相同;为空表示输入图全图都做角点处理
  • blockSize:每个像素计算协方差矩阵时的邻域大小,具体见cornerEigenValsAndVecs()
  • useHarrisDetector:设为true表示使用Harris角点检测器,见cornerHarris();否则使用cornerMinEigenVal()
  • k:当使用Harris角点检测器时会用到,见cornerHarris()

5. 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 
)		

5.1. 功能

        使用LK金字塔光流法计算稀疏特征点的光流。

5.2. 参数

  • prevImg:第一张8bit的输入图,或者通过buildOpticalFlowPyramid()构造的金字塔图集
  • nextImg:第二张输入图,或者通过buildOpticalFlowPyramid()构造的金字塔图集;尺寸和类型与prevImg一致
  • prevPts:用于计算光流的图像特征点,格式为单精度浮点型
  • nextPts:输出的单精度浮点类型的2D点集,对应着prevPts在nextImg中的位置;当flags参数中包含OPTFLOW_USE_INITIAL_FLOW标志位时,该参数也会被作为优化计算的初始值,其元素数量必须与prevPts相同
  • status:输出的无符号整形向量,元素为1表明prevPts中对应点的光流计算成功,为0表示失败
  • err:输出的误差向量,其类型可以通过下面的flags参数设置;如果某个点的光流计算失败(通过上面的status判断),则对应的err状态为未定义
  • winSize:金字塔图像中每层图像的搜索窗口大小
  • maxLevel:以0为开始节点的金字塔最高层数;设为0表示不构造金字塔(单层),设为1表示有两层图像,以此类推;如果传入的图像是金字塔图集,则算法中使用的图像层数也不会超过maxLevel
  • criteria:迭代搜索算法的终止条件,譬如迭代次数超过了criteria.maxCount或者搜索窗口的移动小于criteria.epsilon时停止计算
  • flags:OPTFLOW_USE_INITIAL_FLOW表示将nextPts作为优化计算的初始值,如果不使用该标志位prevPts会拷贝到nextPts;OPTFLOW_LK_GET_MIN_EIGENVALS表示使用协方差矩阵的较小的特征值作为误差测量值,如果没有设置该标志位,则将原始点周围区域的像素和移动后点周围像素亮度值的平均差异作为err
  • minEigThreshold:算法计算每个特征点光流方程中2x2矩阵的较小的特征值,然后除以邻域像素数;如果这个值小于minEigThreshold,对应特征点的光流将不会计算,以避免计算得到误差较大的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mega_Li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值