2012-11-26 27 views
1

全部:在JavaCV中捕获帧错误

我正在运行带有32位Java和32位OpenCV 2.4.3的Windows XP(32位)。当我试图捕捉从AVI视频帧在Eclipse中以下代码:

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检测到致命错误运行环境:

EXCEPTION_ACCESS_VIOLATION(0000005)中的PC = 0x77c46fa3,PID = 4776,TID = 3392

JRE版本:7.0_02-B13 的Java VM:爪哇的HotSpot(TM)客户机VM(22.0-B10混合模式下,共享的窗口86) 有问题的帧: C [MSVCRT.DLL + 0x36fa3]

失败编写核心转储。小型转储不是默认的Windows

的客户端版本启用

更多信息的错误报告文件保存为: C:\ Java项目\ JavaCVTester \ hs_err_pid4776.log

如果你想提交bug报告,请访问: http://bugreport.sun.com/bugreport/crash.jsp 崩溃发生在Java虚拟机之外的本地代码中。 查看有问题的框架报告错误的位置。

====================错误消息的结束==================

有人可以帮我解决这个问题吗?

在此先感谢。

+0

请[FFmpeg的(http://ffmpeg.org/download.html)和'FFmpegFrameGrabber'试试吧。 –

回答

0

尝试重新安装您的jre。 还转到Windows启动&恢复选项。选择“编写调试选项”至“完成内存转储”。

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; 
    } 
} 
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); 

    } 
}