我是新来的论坛。几周前我开始使用Opencv与Java。在我的程序中,我使用videocapture从avi文件中读取帧。昨天我注意到,在我的progrem的不同运行中,从前一次运行中,从文件读取的第n帧与从同一文件中读取的第n帧不同。在将视频捕捉重置为相同的帧编号后,我已通过减去同一帧的两个副本来确认这一点。这是预期的,还是我做错了什么? 下面是代码:videocapture在多次调用中读取相同的帧不同
/*==========================*/
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));
}
/*==========================*/
在这段代码我很感兴趣,只提取从视频的第一帧。 “抓取”调用位于两个内部循环中,以确保耗尽视频捕捉对象中似乎是帧缓冲区的内容;在我的情况下缓冲区大小是9,但我不确定这是为什么。外循环只是多次测试整个程序。 System.out的输出偶尔是非零的,例如在100次循环迭代中5-6次。相反,我会希望它始终为零,因为本质上该程序正在读取相同的第一帧两次,因此,absdiff的输出应为零。
如果删除所有'.grab()'调用,会发生什么?你可以尝试使用第二个VideoCapture?你的文件是视频吗?它有一些特殊的编码吗?如果是,第一帧是关键帧?你能提供输入吗? – Micka
如果我用.read替换.grab,我仍然有同样的问题。 我正在使用第二个视频捕捉,因为我正在释放第一个视频捕捉并分配一个新视图。 我使用的视频是从列表中的第二个可用: ftp://motinas.elec.qmul.ac.uk/pub/iLids/ 我不确定第一帧是否是K帧,但即使我读了第二,第三等,也存在同样的问题... – gaetano