我试图建立一个真实的帧插值程序的视频。因为我一直使用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);
字符串
2条答案
按热度按时间wribegjk1#
我不是EmguCVMaven,但如果我没记错,Image只能存储整数值。如果将“flow”定义为Image,则会丢失信息,因为DISOpticalFlow应返回浮点矩阵。
在opencv c++中,我声明了我的流矩阵,如
字符串
然后通过将流量的大小和方向Map到颜色空间来将其转换为图像。
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)必须以这种方式使用。