1

全部:

我正在运行带有 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 运行时环境检测到一个致命错误:

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 虚拟机之外的本地代码中。请参阅有问题的框架以了解报告错误的位置。

==================== 错误信息结束 ==================

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

提前致谢。

4

3 回答 3

0

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

于 2012-12-01T08:34:41.133 回答
0

OpenCVFrameGrabber不支持许多视频格式。错误消息“[...] Problematic frame: 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;
    }
}
于 2013-12-03T08:01:49.530 回答
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);

  }
}
于 2014-06-28T11:29:40.067 回答