移动对象跟踪三要素:图像表示(跟踪的对象要在图像中出现)外光模型,移动模型。
稀疏光流跟踪,KTL
void calcOpticalFlowPyrLK( // 稀疏光流跟踪,KLT
InputArray prevImg, // 要跟踪的图像,8bit
InputArray nextImg, // 在目标图像跟跟踪 prevImg 上的 prevPts 特征点
InputArray prevPts, // prevImg 上的特征点(光流)的坐标位置;点坐标必须是单精度浮点数
InputOutputArray nextPts, // 如果在 nextImg 上跟踪到了 prevImg 上的 prevPts[i],则在 nextPts[i] 上保存该特征点现在的坐标,nextPts与prevPts尺寸相同
OutputArray status, // 输出状态向量(无符号char);如果相应位置的流特征被发现,向量的每个元素被设置为1,否则,被置为0.
OutputArray err, // 跟踪时候区域误差和
Size winSize = Size(21,21), // 在每个金字塔水平搜寻窗口的尺寸。
int maxLevel = 3, // 金字塔的高度,初始为3层
TermCriteria criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01), // 在每个金字塔层,为某点寻找光流的迭代过程的终止条件
// flags CV_LKFLOW_PYR_A_READY , 在调用之前,第一帧的金字塔已经准备好
CV_LKFLOW_PYR_B_READY , 在调用之前,第二帧的金字塔已经准备好
CV_LKFLOW_INITIAL_GUESSES , 在调用之前,数组 B 包含特征的初始坐标 (Hunnish: 在本节中没有出现数组 B,不知是指的哪一个)
int flags = 0,
double minEigThreshold = 1e-4 // 大量实验得出的默认值,别乱改
);
代码:
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
#include<opencv2/face.hpp>
#include<iostream>
#include<math.h>
#include <string>
#include<fstream>
using namespace cv::face;
using namespace cv;
using namespace std;
using namespace cv::xfeatures2d;
Mat frame, gray;//当前帧
Mat prev_gray;//前一帧