所有
我使用32位Java和32位OpenCV 2.4.3运行Windows XP(32位)。当我尝试使用Eclipse中的以下代码从AVI捕获视频帧时:
import com.googlecode.javacv.FrameGrabber.Exception;
import com.googlecode.javacv.OpenCVFrameGrabber;
public class FrameReader
{
public static void main(String[] args) throws Exception,
InterruptedException
{
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber("hall_gray.avi");
grabber.start();
grabber .release();
return;
}//End method
}//End class
发生以下错误:
==========================错误开始================== =======
Java Runtime Environment检测到致命错误:
EXCEPTION_ACCESS_VIOLATION(0xc0000005)at pc = 0x77c46fa3,pid = 4776,tid = 3392
JRE版本:7.0_02-b13 Java VM:Java HotSpot(TM)客户端VM(22.0-b10混合模式,共享windows-x86) 有问题的框架: C [msvcrt.dll + 0x36fa3]
无法编写核心转储。默认情况下,在Windows的客户端版本
上未启用小型转储包含更多信息的错误报告文件保存为: C:\ Java Projects \ JavaCVTester \ hs_err_pid4776.log
如果您想提交错误报告,请访问: http://bugreport.sun.com/bugreport/crash.jsp 崩溃发生在Java虚拟机外部的本机代码中。 查看有问题的框架,了解报告错误的位置。
====================错误消息结束==================
有人可以帮我解决这个问题吗?
提前致谢。
答案 0 :(得分:0)
尝试重新安装你的jre。 也去windows启动和;恢复选项。选择“编写调试选项”到“完成内存转储”。
答案 1 :(得分:0)
OpenCVFrameGrabber
不支持多种视频格式。错误消息“[...]有问题的框架:C [msvcrt.dll + 0x36fa3] [...]”可能指出,您的视频格式可能不受支持。
FFmpegFrameGrabber
更灵活。请尝试以下代码:
import com.googlecode.javacv.FFmpegFrameGrabber;
import com.googlecode.javacv.FrameGrabber;
import com.googlecode.javacv.FrameGrabber.Exception;
public class FrameReader {
public static void main(String[] args) throws Exception {
FrameGrabber grabber = new FFmpegFrameGrabber("hall_gray.avi");
grabber.start();
grabber.release();
return;
}
}
答案 2 :(得分:0)
在JavaCV中,您可以使用FFmpegFrameGrabber,它是OpenCVFrameGrabber的包装器,它有很多方法而不是OpenCVFrameGrabber。
尝试使用以下代码从视频中提取和保存帧:
import java.io.File;
import com.googlecode.javacv.FFmpegFrameGrabber;
import com.googlecode.javacv.Frame;
import com.googlecode.javacv.cpp.opencv_core.IplImage;
import static com.googlecode.javacv.cpp.opencv_highgui.cvSaveImage;
public class Getting_Frames
{
public static void main(String[] args) throws Exception
{
File f = new File("example.avi");
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(f);
try {
grabber.start();
} catch (com.googlecode.javacv.FrameGrabber.Exception e1) {
}
long frameLength = grabber.getLengthInFrames();
int increment = (int) Math.ceil(frameLength / 30);
if (frameLength < 30) {
System.err.println("Not enough frames");
}
// To grab frames per 30 seconds
Frame[] s_frame = new Frame[1000];
for (int i=0, frame_counter = 0; i < frameLength; frame_counter++) {
if((frame_counter % 2000 )==0)
{
s_frame[i]=grabber.grabKeyFrame();
IplImage temp = s_frame[i].image;
System.out.println(temp.nChannels()+" "+temp.origin()+" "+temp.highValue());
cvSaveImage(i+"new.jpg",temp);
i++;
}
}
// To know number for each video
System.out.println(frameLength);
}
}