2016-05-23 80 views
1

我是新来的论坛。几周前我开始使用Opencv与Java。在我的程序中,我使用videocapture从avi文件中读取帧。昨天我注意到,在我的progrem的不同运行中,从前一次运行中,从文件读取的第n帧与从同一文件中读取的第n帧不同。在将视频捕捉重置为相同的帧编号后,我已通过减去同一帧的两个副本来确认这一点。这是预期的,还是我做错了什么? 下面是代码:videocapture在多次调用中读取相同的帧不同

/*==========================*/ 
for (int j = 0; j < 100; j++){ 
    Mat img = new Mat(); 
    Mat m1 = new Mat(); 
    Mat m2 = new Mat(); 

    VideoCapture vc = new VideoCapture(filename); 
    vc.set(Videoio.CAP_PROP_POS_FRAMES, 0); 
    for (int i = 0; i < 9; i++) vc.grab(); 
    vc.read(img); 
    m1 = img.clone(); 
    Imgproc.cvtColor(m1, m1, Imgproc.COLOR_BGR2GRAY); 
    vc.release(); 

    vc = new VideoCapture(filename); 
    vc.set(Videoio.CAP_PROP_POS_FRAMES, 0); 
    for (int i = 0; i < 9; i++) vc.grab(); 
    vc.read(img); 
    m2 = img.clone(); 
    Imgproc.cvtColor(m2, m2, Imgproc.COLOR_BGR2GRAY); 
    vc.release(); 

    Mat m3 = new Mat(); 
    Core.absdiff(m1, m2, m3); 

    if (Core.countNonZero(m3) > 0)System.out.println(Core.sumElems(m3)); 
} 
/*==========================*/ 

在这段代码我很感兴趣,只提取从视频的第一帧。 “抓取”调用位于两个内部循环中,以确保耗尽视频捕捉对象中似乎是帧缓冲区的内容;在我的情况下缓冲区大小是9,但我不确定这是为什么。外循环只是多次测试整个程序。 System.out的输出偶尔是非零的,例如在100次循环迭代中5-6次。相反,我会希望它始终为零,因为本质上该程序正在读取相同的第一帧两次,因此,absdiff的输出应为零。

+1

如果删除所有'.grab()'调用,会发生什么?你可以尝试使用第二个VideoCapture?你的文件是视频吗?它有一些特殊的编码吗?如果是,第一帧是关键帧?你能提供输入吗? – Micka

+0

如果我用.read替换.grab,我仍然有同样的问题。 我正在使用第二个视频捕捉,因为我正在释放第一个视频捕捉并分配一个新视图。 我使用的视频是从列表中的第二个可用: ftp://motinas.elec.qmul.ac.uk/pub/iLids/ 我不确定第一帧是否是K帧,但即使我读了第二,第三等,也存在同样的问题... – gaetano

回答

0

看来我已经找到了解决我的问题的方法,但我仍然不确定这是否是正确的解决方法:我已将Opencv build bin文件夹中的“opencv_ffmpeg310_64.dll”文件复制到eclipse中项目。现在两个帧的差别总是为零。

当我按照Opencv网站上关于如何在Eclipse中集成Opencv的指南时,没有提到它包含此dll。

...现在我想知道Opencv是如何管理没有该DLL的第一个地方,没有给出错误或异常?我相信我的电脑上没有其他任何ffmpeg的安装。对此有何想法?

相关问题