我是论坛的新手。几周前我已经开始使用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的输出应为零。
答案 0 :(得分:0)
我似乎找到了解决问题的方法,虽然我仍然不确定这是否是解决此问题的正确方法:我已将Opencv build bin文件夹中的“opencv_ffmpeg310_64.dll”文件复制到我的eclipse项目中。现在两个帧的差异总是为零。
当我按照Opencv网站上关于如何在Eclipse中集成Opencv的指南时,没有提到包含此dll的内容。
...现在我想知道Opencv如何在没有该dll的情况下管理,没有给出错误或异常???我确信我的电脑上没有任何其他的ffmpeg安装。有什么想法吗?