C#Emgu:使用DISOpticalFlow

时间:2017-07-29 10:11:07

标签: c# opencv interpolation emgucv opticalflow

大家好日子,

我正在尝试为视频构建一个实时帧插值程序。 因为我一直使用C#,所以我选择使用OpenCV和Emgu 3.2.0(最新版本)。

所以,就是这样:

首先,我有两张名为frame1和frame2的图片,显然是我视频中的两帧。

接下来,我将构建我的DISOpticalFlow对象,如下所示

现在我必须用它来获得这两帧之间的平移向量。

所以我构建了一个名为flow的Gray Image,我使用了DISOpticalFlow的calc方法。

Aaaaand ......没什么。无论我尝试什么,流量始终为空(参见此屏幕:http://imgur.com/ozN0XgN

我错过了什么或做错了什么?

感谢大家阅读并度过美好的一天!

代码:

//My items
Image<Bgr, Byte> frame1 = new Image<Bgr, Byte>(1280, 720);
Image<Bgr, Byte> frame2 = new Image<Bgr, Byte>(1280, 720);
DISOpticalFlow opticalFlowAlgorithm = new DISOpticalFlow(DISOpticalFlow.Preset.Medium);
Image<Gray, Byte> flow= new Image<Gray, Byte>(1280, 720);


//Get my frame from my server
//Note : this is working without any problem, if I display those frames with CvInvoke.Imshow, everything is good
server.waitFrame.WaitOne();
frame1.Bytes = server.frame1;
server.waitFrame.WaitOne();
frame1.Bytes = server.frame1;

//Now I get my optical flow :
opticalFlowAlgorithm.Calc(frame1.Convert<Gray, byte>(), frame2.Convert<Gray, byte>(), flow);

2 个答案:

答案 0 :(得分:1)

我不是EmguCV专家,但如果我没记错,Image只能存储整数值。 如果将“flow”定义为Image,则会丢失信息,因为DISOpticalFlow应返回浮点矩阵。

在opencv c ++中,我声明了我的流矩阵,例如

 Mat_<Point2f> flow;

然后通过将流量的大小和方向映射到色彩空间将其转换为图像。

答案 1 :(得分:0)

任何光流场都是连续的(即浮动或两倍)2通道(X和Y像素运动)图。要显示它,必须将其映射到可视范围。最简单的方法是通过计算max(255,Channel_0*Channel_0 + Channel_1*Channel_1)来显示运动幅度,将其四舍五入/转换回整数。此外,传递的数据类型也可能必须是浮动映射。

免责声明:我从未使用过Emgu,也从未使用过DISFlow的OpenCV版本。但是我是原始论文的作者,所以我的代码(https://github.com/tikroeger/OF_DIS)必须以这种方式使用。