c# - C#Emgu:使用DISOpticalFlow

标签 c# opencv interpolation emgucv opticalflow

今天是个好日子,

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

就是这样:

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

接下来,我按如下方式构建DISOpticalFlow对象

现在,我必须使用它来获取这两个帧之间的转换 vector 。

因此,我建立了一个名为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);

最佳答案

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

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

 Mat_<Point2f> flow;

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

关于c# - C#Emgu:使用DISOpticalFlow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45387997/

相关文章:

math - 什么数学方法适用于 2d 到 2d 函数的插值?

c# - Controller和View之间的抽象层

c# - 将枚举序列化为从 Azure Function 返回的 JSON 中的字符串

c++ - OpenCV Blob 检测 : separate close blobs

c++ - 检测图像的特定矩形部分

Python 在二维网格上插入点值

python - 当 x 数组的前 2 个值相同时,为什么 scipy 中的 interp1d 给出 NaN? (填充值 = 0)

c# - Web 应用程序的 UML 类图 MVC 模式

c# - 异步和线程文化

macos - 无法在Mac上安装OpenCv:/usr/local中没有文件