【问题标题】:videocapture reads the same frame differently on multiple callsvideocapture 在多个调用中以不同方式读取同一帧
【发布时间】:2016-05-24 22:35:57
【问题描述】:

我是论坛的新手。几周前我开始使用 Opencv 和 Java。在我的程序中,我使用 videocapture 从 avi 文件中读取帧。昨天我注意到,在我的程序的不同运行中,从文件中读取的第 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));
}
/*==========================*/

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

【问题讨论】:

  • 如果删除所有.grab() 调用会发生什么?您可以尝试使用第二个 VideoCapture 吗?你的文件是视频吗?它有一些特殊的编码吗?如果是,第一帧是关键帧吗?你能提供输入吗?
  • 如果我将 .grab 替换为 .read,我仍然会遇到同样的问题。我正在有效地使用第二个视频捕获,因为我正在发布第一个并分配一个新的。我正在使用的视频是列表中的第二个视频:motinas.elec.qmul.ac.uk/pub/iLids 我不确定第一帧是否是 k 帧,但即使我阅读了第二帧、第三帧等等,也会出现同样的问题...

标签: java opencv


【解决方案1】:

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

当我按照 Opencv 网站上关于如何在 Eclipse 中集成 Opencv 的指南进行操作时,没有提到包含这个 dll。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多