在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));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)