【发布时间】: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 帧,但即使我阅读了第二帧、第三帧等等,也会出现同样的问题...