Opencv中三个光流跟踪函数

在slam里,光流跟踪判断图像中某一物体的动态性,主要包括3个函数:

1、goodFeaturesToTrack函数

作用:提取输入图像中像素级别的角点,支持harris角点和Shi Tomasi角点。

函数原型:

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

参数说明:

  • 第一个参数:此函数的输入参数,输入为灰度图像;
  • 第二个参数:此函数的输出参数,输出为角点,保存类型为vector或数组;
  • 第三个参数:表示函数提取到角点的数量最大值;
  • 第四个参数:表示检测到的角点的质量等级(通常是0.10到0.01之间的数值,不能大于1.0);
  • 第五个参数:表示两个角点间最小间距,以像素为单位,间距小于此像素值的像素会被合并;
  • 第六个参数:一般为cv::Mat类型,维度和输入一致,mask值为0处不进行角点检测;
  • 第七个参数:表示在计算角点时参与运算的区域大小,常用值为3,但是如果图像的分辨率较高则可以考虑使用较大一点的值;
  • 第八个参数:表示是否使用Harris角点检测,为false,则使用Shi-Tomasi角点;
  • 第九个参数:提取Harris角点用到的中间参数,一般取经验值0.04~0.06。当为Shi-Tomasi角点时,此参数不起作用;

2、cv::cornerSubPix()函数

作用:由于goodFeaturesToTrack函数提取的角点是像素级别,在slam等一些情况里应用像素级别的角点不满足精度要求,cornerSubPix()函数能将像素级角点作进一步的优化计算,使之达到亚像素级别。

函数原型:

void cornerSubPix(InputArray image,
					InputOutputArray corners, 
						Size winSize, 
							Size zeroZone, 
								TermCriteria criteria)

参数说明:

  • 第一个参数:表示输入的图像,以上两个函数输入图像必须一致;
  • 第二个参数:表示输入的角点,一般为goodFeaturesToTrack函数提取的角点,该参数也存储输出的亚像素角点;
  • 第三个参数:表示计算亚像素角点时考虑的区域边长的一半;
  • 第四个参数:表示死区的一半尺寸,值设为cv::Size(-1,-1)则表示没有这个区域;
  • 第五个参数:表示计算亚像素角点停止迭代的条件,要么是迭代数大于某个设定值,要么是精度达到某个设定值,甚至可以是它们的组合;

3、calcOpticalFlowPyrLK()函数

作用:基于图像金字塔的LK光流跟踪

函数原型:

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),
)	

参数说明:

  • 第一个参数:上一帧灰度图像,作为基准;
  • 第二个参数:用于光流跟踪的灰度图像,与上一帧灰度图像大小相同、类型一致;
  • 第三个参数:上一帧图像检测的角点;
  • 第四个参数:用于光流跟踪的灰度图像输出的角点
  • 第五个参数:表示状态向量,跟踪成功的角点设置状态为1,否则设置为0;
  • 第六个参数:输出错误向量;
  • 第七个参数:每个金字塔的搜索窗口的大小;
  • 第八个参数:表示金字塔的高度;
  • 第九个参数:指定迭代搜索算法的终止条件;

实例:

cv::goodFeaturesToTrack(
mImGrayPre, 
lastFramePoints, 
1000, 
0.01, 
8,
cv::Mat(),
3,
false, 
0.04);  

cv::cornerSubPix(
mImGrayPre, 
lastFramePoints, 
cv::Size(5, 5), 
cv::Size(-1, -1), 
cv::TermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 30, 0.01));

cv::calcOpticalFlowPyrLK(
mImGrayPre, 
imGray, 
lastFramePoints, 
trackedPoints, 
state, 
err, 
cv::Size(21, 21), 
3, 
cv::TermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 30, 0.01));

你可能感兴趣的:(opencv光流,图像处理,opencv,计算机视觉)