这次,我们用举例的方法来了解一下视频处理,我们采用上一篇博客中用到的代码,使用类继承来减少代码量
这次的目标是跟踪移动物体,我们先创建一个FeatureTrack类,它继承自VideoProcess类
在看这个类之前,我们先介绍几个函数
首先是calcOpticalFlowPyrLK,这个函数的作用原理是光流法,它输入的点(第三个参数)是图像2中的角点坐标,它将会根据输入的图像1和图像2,对这两张图中的亮度进行比较,这些比较都是在输入的角点坐标附近进行比较,得出最终的运动角点坐标(第四个参数),也就是可能的运动角点
void 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 );
第一个参数是第一幅图像
第二个参数是第二幅图像
第三个参数是第一幅图像中的特征点
第四个参数是寻找到的移动过后的特征点
第五个参数表示跟踪成功,跟踪成功时返回1
第六个参数表示跟踪失败,给出提示,但我们一般只是用status
然后是goodFeaturesToTrack,这个函数用来确定所有角点
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 );
第一个参数是输入图像
第二个参数是返回的角点坐标
第三个参数是最大角点数
第四个参数是质量等级,用来确定是否选取检测到的角点
第五个参数是最小距离,用来筛选距离较小的角点