今天是个好日子,
我正在尝试为视频构建实时帧插值程序。
因为我一直使用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/