视频捕捉在多次通话中以不同的方式读取相同的帧

时间:2016-05-23 14:47:43

标签: java opencv

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

/*==========================*/
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));
}
/*==========================*/

在这段代码中,我感兴趣的是只从视频中提取第一帧。 &#34;抓住&#34;调用是在两个内部循环中,以确保耗尽它在VideoCapture对象中看起来像帧缓冲区;在我的情况下缓冲区大小是9,虽然我不知道为什么会这样。外循环只是为了多次测试整个程序。 System.out的输出有时非零,例如在100次循环迭代中的5-6次。相反,我希望它总是为零,因为基本上程序正在读取相同的第一帧两次,因此,absdiff的输出应为零。

1 个答案:

答案 0 :(得分:0)

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

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

...现在我想知道Opencv如何在没有该dll的情况下管理,没有给出错误或异常???我确信我的电脑上没有任何其他的ffmpeg安装。有什么想法吗?