C#Emgu:使用DISOpticalFlow

今天是个好日子,

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

所以,这是它:

首先,我有两个名为frame1和frame2的图像,显​​然是我video中的两帧。

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

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

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

Aaaaand ……没什么。 无论我尝试什么,流量总是空的(参见此屏幕: http : //imgur.com/ozN0XgN )

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

感谢大家阅读,祝你有个美好的一天!

代码:

//My items Image frame1 = new Image(1280, 720); Image frame2 = new Image(1280, 720); DISOpticalFlow opticalFlowAlgorithm = new DISOpticalFlow(DISOpticalFlow.Preset.Medium); Image flow= new Image(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(), frame2.Convert(), flow); 

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

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

  Mat_ flow; 

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

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

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