C# Emgu:DISOpticalFlow 的使用

Posted

技术标签:

【中文标题】C# Emgu:DISOpticalFlow 的使用【英文标题】:C# Emgu : Use of DISOpticalFlow 【发布时间】:2017-07-29 10:11:06 【问题描述】:

大家好,

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

所以,就是这样:

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

接下来我构建我的 DISOpticalFlow 对象如下

现在我必须使用它来获取这 2 帧之间的平移向量。

所以我构建了一个名为 flow 的灰度图像,并使用了 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);

【问题讨论】:

【参考方案1】:

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

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

 Mat_<Point2f> flow;

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

【讨论】:

【参考方案2】:

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

免责声明:我从未使用过 Emgu,也从未使用过 OpenCV 版本的 DISFlow。但我是原论文的作者,我的代码(https://github.com/tikroeger/OF_DIS)就得这样使用。

【讨论】:

以上是关于C# Emgu:DISOpticalFlow 的使用的主要内容,如果未能解决你的问题,请参考以下文章

C#,Emgu 网络摄像头 - 选择捕获大小

C# 使用 Emgu 按像素颜色裁剪图像

Emgu (OpenCV for C#) - 使用 cvStereoRectify 构建视差图

Emgu CV 图像捕获使用 C#

c# emgu/opencv 使用抛出异常 - 试图读取或写入受保护的内存

利用Emgu.CV实现人脸识别详解 (C#)--附源码