最近在研究KLT光流法对运动目标的跟踪,这里贴出我根据《Learning OpenCV3》及《OpenCV3 CookBook》相关源码进行简化得出的对视频中运动物体的跟踪实现。
简介
它是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的相应关系,从而计算出相邻帧之间物体的运动信息的一种方法。一般而言,光流是因为场景中前景目标本身的移动、相机的运动,或者两者的共同运动所产生的。
原理
详细的原理讲解,可参考这两篇博客:
- https://www.cnblogs.com/mthoutai/p/7150625.html
- https://www.cnblogs.com/moondark/archive/2012/05/12/2497391.html
代码
- 《Learning OpenCV3》实现
《Learning OpenCV3》中给出的源码,只实现了2张图片之间的目标跟踪,但是包括了KLT目标追踪的全部流程。具体源码和图片可从官网下载:https://github.com/oreillymedia/Learning-OpenCV-3_examples
官网源码得出的结果:
- 《OpenCV3 CookBook》的简化实现
《OpenCV3 CookBook》书中给出的源码,为了兼容整章内容,所以代码整个框架显得比较紧密,理解起来略显复杂。这里对其进行了简化,分离出了有关KLT目标追踪的部分,供大家参考:
#include <iostream>
#include <string>
#include <vector>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/features2d.hpp>
#include <opencv2/video/tracking.hpp>
using namespace std;
using namespace cv;
int main(int argc, char* argv[]) {
cv::Mat output;
cv::Mat gray; // current gray-level image
cv::Mat gray_prev; // previous gray-level image
std::vector<cv::Point2f> points[2]; // tracked features from 0->1
std::vector<cv::Point2f> initial; // initial position of tracked points
std::vector<uchar> status; // status of tracked features
std::vector<float> err; // error in tracking
cv::VideoCapture