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 的使用的主要内容,如果未能解决你的问题,请参考以下文章
Emgu (OpenCV for C#) - 使用 cvStereoRectify 构建视差图