一、前言
经过实际测试,GPU版本的金字塔LK光流法在速度上比CPU版本快了5倍多。。。测试视频大小为640*480
二、代码
#include <opencv2/opencv.hpp>
#include <opencv2/gpu/gpu.hpp>
#include <opencv2/gpu/gpumat.hpp>
using namespace cv;
#include <iostream>
#include <windows.h>
#include "MyTimer.h"
int main()
{
const std::string fname("1.avi");
VideoCapture cap(fname);
if (!cap.isOpened()){
std::cerr << "无法打开视频";
return -1;
}
Mat srcImg;
Mat prev;
Mat curr;
MyTimer timerCounter;
while (cap.read(srcImg)){
cvtColor(srcImg, curr, CV_BGR2GRAY);
//cpu的KLT占用时间
if (!prev.empty()){
timerCounter.Start();
vector<Point2f> cornersVec;
int maxCorners = 500;
double qualityLevel = 0.01;
double minDistance = 0.0;
goodFeaturesToTrack(prev, cornersVec, maxCorners, qualityLevel, minDistance);
vector<Point2f> flowPoints;
vector<uchar> status; //相应的点如果出现光流则被标记为1
vector<float> err;
calcOpticalFlowPyrLK(prev, curr, cornersVec, flowPoints, status, err);
timerCounter.End();
std::cout << "CPU LK光流调用时间为:" << timerCounter.costTime << " \n";
}
//gpu的KLT占用时间
if (!prev.empty()){
timerCounter.Start();
gpu::GpuMat prev_g;
gpu::GpuMat curr_g;
gpu::GpuMat prevPts_g;
gpu::GpuMat currPts_g;
gpu::PyrLKOpticalFlow pyrLkDetector;
gpu::GoodFeaturesToTrackDetector_GPU goodFeatFinder(500, 0.01, 0.0, 3, true);
gpu::GpuMat status;
gpu::GpuMat err;
prev_g.upload(prev);
curr_g.upload(curr);
goodFeatFinder(prev_g, prevPts_g); //第三个选项是mask
pyrLkDetector.sparse(prev_g, curr_g, prevPts_g, currPts_g, status, &err);
prev_g.release();
curr_g.release();
prevPts_g.release();
currPts_g.release();
status.release();
err.release();
timerCounter.End();
std::cout << "GPU LK光流调用时间为:" << timerCounter.costTime << " \n";
}
cv::swap(prev, curr);
}
return 0;
}
三、结果