java - videocapture 在多个调用中以不同方式读取同一帧

标签 java opencv

我是论坛的新手。几周前我开始将 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 的输出应该为零。

最佳答案

看来我已经找到了解决问题的方法,尽管我仍然不确定这是否是解决此问题的正确方法:我已将“opencv_ffmpeg310_64.dll”文件从 Opencv build bin 文件夹复制到我的 eclipse 项目.现在两帧的差异确实为零,始终如此。

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

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

关于java - videocapture 在多个调用中以不同方式读取同一帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37394121/

相关文章:

c++ - pytorch C++与alexnet和cv::imread图像

c++ - 使用 Opencv 检测文本上的角点

python - 使用 python 和 opencv 查找图像中的区域

c++ - OpenCV Draw 绘制 2 个最大对象的轮廓

java - 按钮 setOnClickListener 函数调用问题

java - MongoDB DBObject 和 org.json.JSONObject 之间的桥梁?

java - 当键盘出现时屏幕没有向上滚动

python - 在图像中的一组点周围找到不同的边界

java - 呈现 Java JPasswordField?

java - MissingResourceException 运行 MXJ for MySQL