opencv C# Emgu:使用DISOpticalFlow

disho6za  于 2023-08-06  发布在  C#
关注(0)|答案(2)|浏览(140)

我试图建立一个真实的帧插值程序的视频。因为我一直使用C#,所以我选择在Emgu 3.2.0(最新版本)中使用OpenCV。
所以,这是它:
首先,我有两个图像,分别名为frame 1和frame 2,它们显然是我视频中的两帧。
接下来,我将按如下方式构建DISOpticalFlow对象
现在我必须使用它来获得这两个帧之间的平移向量。
因此,我构建了一个名为flow的Gray Image,并使用了DISOpticalFlow的calc方法。
啊...什么都没有。无论我尝试什么,流量总是空的(请参见此屏幕:https://i.stack.imgur.com/Y7xdT.jpg)的数据库
我错过了什么或做错了什么?
谢谢大家的阅读,祝你有美好的一天!
产品编号:

//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);

字符串

wribegjk

wribegjk1#

我不是EmguCVMaven,但如果我没记错,Image只能存储整数值。如果将“flow”定义为Image,则会丢失信息,因为DISOpticalFlow应返回浮点矩阵。
在opencv c++中,我声明了我的流矩阵,如

Mat_<Point2f> flow;

字符串
然后通过将流量的大小和方向Map到颜色空间来将其转换为图像。

yvgpqqbh

yvgpqqbh2#

任何光流场都是连续的(即浮点或双精度)2通道(X和Y像素运动)贴图。要显示它,您必须将其Map到可视范围。最简单的方法是通过计算max(255,Channel_0*Channel_0 + Channel_1*Channel_1)来显示运动幅度,将其舍入/转换回整数。此外,传递的数据类型可能也必须是float map。
免责声明:我从未使用过Emgu,也没有使用过DISFlow的OpenCV版本。但我是原始论文的作者,我的代码(https://github.com/tikroeger/OF_DIS)必须以这种方式使用。

相关问题