大家好日子,
我正在尝试为视频构建一个实时帧插值程序。 因为我一直使用C#,所以我选择使用OpenCV和Emgu 3.2.0(最新版本)。
所以,就是这样:
首先,我有两张名为frame1和frame2的图片,显然是我视频中的两帧。
接下来,我将构建我的DISOpticalFlow对象,如下所示
现在我必须用它来获得这两帧之间的平移向量。
所以我构建了一个名为flow的Gray Image,我使用了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);
答案 0 :(得分:1)
我不是EmguCV专家,但如果我没记错,Image只能存储整数值。 如果将“flow”定义为Image,则会丢失信息,因为DISOpticalFlow应返回浮点矩阵。
在opencv c ++中,我声明了我的流矩阵,例如
Mat_<Point2f> flow;
然后通过将流量的大小和方向映射到色彩空间将其转换为图像。
答案 1 :(得分:0)
任何光流场都是连续的(即浮动或两倍)2通道(X和Y像素运动)图。要显示它,必须将其映射到可视范围。最简单的方法是通过计算max(255,Channel_0*Channel_0 + Channel_1*Channel_1)
来显示运动幅度,将其四舍五入/转换回整数。此外,传递的数据类型也可能必须是浮动映射。
免责声明:我从未使用过Emgu,也从未使用过DISFlow的OpenCV版本。但是我是原始论文的作者,所以我的代码(https://github.com/tikroeger/OF_DIS)必须以这种方式使用。