基本原理
光流是由物体或照相机的运动引起的两个连续帧之间图像物体的视运动的模式。它是2D向量场,其中每个向量都是位移向量,表示点从第一帧到第二帧的运动。
光流在以下领域具有许多应用: - 运动的结构 - 视频压缩 - 视频稳定…
稀疏光流KLT
限制: 1. 亮度恒定 2.缓慢移动 3.空间一致性
操作步骤:输入第一帧图片,利用harris特征检测进行特征点检测,通过特征点进行的跟踪。
稠密光流HF
步骤:不会再去寻找特征点,直接读取两帧图片,然后图片对比,寻找差异,将所有移动的点用多项式表达出来。
#include<opencv2/opencv.hpp>
#include<iostream>
#include <math.h>
using namespace cv;
using namespace std;
void drawOpticalFlowHF(const Mat &flowdata, Mat &image, int step);
int main()
{
//VideoCapture capture;
//capture.open("D:/wv_demo.mp4");
VideoCapture capture(0);
if (!capture.isOpened()) {
printf("could not find the video");
return -1;
}
Mat frame,gray;
Mat prev_frame, prev_gray;
Mat flowResult,flowdata;
capture.read(frame);
cvtColor(frame, prev_gray, COLOR_BGR2GRAY);
namedWindow("flow", WINDOW_AUTOSIZE);
namedWindow("input", WINDOW_AUTOSIZE);
//从第二针开始读取
while(capture.read(frame))
{
cvtColor(frame,gray,COLOR_BGR2GRAY);
if (!prev_gray.empty())
{
calcOpticalFlowFarneback(prev_gray, gray, flowdata, 0.5, 3, 15, 3, 5, 1.2, 0);
cvtColor(prev_gray, flowResult, COLOR_GRAY2BGR);
drawOpticalFlowHF(flowdata,flowResult,10);
imshow("flow", flowResult);
imshow("input", frame);
}