在JavaCV中捕获帧时出错

时间:2012-11-26 03:03:48

标签: javacv

所有

我使用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虚拟机外部的本机代码中。 查看有问题的框架,了解报告错误的位置。

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

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

提前致谢。

3 个答案:

答案 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);

  }
}