码迷,mamicode.com
首页 > 其他好文 > 详细

开源项目(6-2)光流法

时间:2019-07-09 22:10:04      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:比较   create   enc   https   合并   ack   iter   oct   cuda   

 

合并使用gpu::FarnebackOpticalFlow计算的水平光流flowx 和垂直光流flowy

https://blog.csdn.net/DumpDoctorWang/article/details/78668154

 

一、问题来源
近期在学习GPU加速。无意间看到OpenCV库中有用GPU来计算光流的类gpu::FarnebackOpticalFlow,CPU上的光流函数是calcOpticalFlowFarneback。经过测试,用GPU上的光流函数计光流类gpu::FarnebackOpticalFlow计算的速度远远比CPU上的函数calcOpticalFlowFarneback快,但是,遇到了一个问题,gpu::FarnebackOpticalFlow输出的结果是两个GpuMat:flowx和flowy,calcOpticalFlowFarneback函数输出的结果是一个Mat类型的flow,包含水平和垂直方向上的光流。到这里,我就不知道该怎么合并flowx和flowy。

二、问题的解决
百度了很久,没有找到资料,国外也去看了,也没有找到。于是打算自己测试,首先测试了flow,flowx和flowy的维数,发现三个得到维数都相同,然后我又查看了这三者的通道数,发现flow的通道是2,flowx和flowy的通道数是1;然后我拿flow的通道1的数据和flowx比对、拿flow的通道二的数据和flowy比较,发现两组数据完全相同,也就是说,将flowx和flowy合并,就可以得到flow!
接下来直接上代码。

//头文件
	#include <opencv2/gpu/gpu.hpp>
	using namespace cv;
	
	///用GPU来完成光流计算
	gpu::GpuMat preGrayGpu(preGray);    //当前帧的灰度Mat
	gpu::GpuMat nextGrayGpu(nextGray);  //下一帧的灰度Mat
	gpu::GpuMat opfGpuX;                //水平方向的光流Mat
	gpu::GpuMat opfGpuY;                //垂直方向的光流Mat
	gpu::FarnebackOpticalFlow mOpticalFlow; 
	mOpticalFlow.winSize = 15;          //mOpticalFlow的应该和calcOpticalFlowFarneback对应的参数相同
	mOpticalFlow.numLevels = 3;
	mOpticalFlow.numIters = 3;
	mOpticalFlow(preGrayGpu,nextGrayGpu,opfGpuX,opfGpuY); //计算光流
	Mat flowX,flowY;
	opfGpuX.download(flowX);
	opfGpuY.download(flowY);

	///合并x,y方向的光流
	Mat flow;             //存储合并后的光流
	vector<Mat> srcOpfMat;
	srcOpfMat.push_back(flowX);
	srcOpfMat.push_back(flowY);
	merge(srcOpfMat,flow); //flow就是合并后的光流

  

Mat pre = imread(...);
Mat next = imread(...);
 
Mat preGray, nextGray;
cvtColor(pre, preGray, CV_BGR2GRAY);
cvtColor(next, nextGray, CV_BGR2GRAY);
 
cuda::GpuMat g_pg(preGray);     //当前帧的灰度GpuMat
cuda::GpuMat g_ng(nextGray);    //下一帧的灰度GpuMat
cuda::GpuMat opfGpu;            //光流GpuMat
auto opf_tool = cv::cuda::FarnebackOpticalFlow::create(3,0.5,false,15,3,5,1.1,0);
Mat opf; // 光流
opf_tool->calc(g_pg,g_ng,opfGpu);
opfGpu.download(opf);

  

开源项目(6-2)光流法

标签:比较   create   enc   https   合并   ack   iter   oct   cuda   

原文地址:https://www.cnblogs.com/kekeoutlook/p/11160743.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!