2012-08-05 66 views
1

因此,我使用JavaCV并试图将帧捕获为来自mp4文件的图像。当我尝试保存图像并且无法在任何地方找到解决方案时,我总是收到EXCEPTION_ACCESS_VIOLATION。 OpenCV,JavaCV和Java都是相同的位数(64)。我也安装了64位visual C++。这里是我使用的代码,任何想法是什么导致这个或什么替代解决方案。感谢您的帮助提前。保存图像时的JavaCV EXCEPTION_ACCESS_VIOLATION

 public class VideoTest { 

     public static void main(final String args[]) { 
      VideoTest vt = new VideoTest(); 
      IplImage[] images = vt.extractVideoFrames("video.mp4"); 
      int i = 1; 
      //Save images 
      for(IplImage image : images) { 
       /* Exception_ACCESS_VIOLATION occurs here */ 
       cvSaveImage(Integer.toString(i) + ".jpg", image); 
       i++; 
      } 
     } 

     /* Extract at least 30 frames from the video at even intervals */ 
     private IplImage[] extractVideoFrames(String videoName) { 
      FrameGrabber grabber = new FFmpegFrameGrabber(videoName); 
      try { 
       grabber.start(); 
      } catch (com.googlecode.javacv.FrameGrabber.Exception e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 

      double frameLength = grabber.getLengthInFrames(); 
      int increment = (int) Math.ceil(frameLength/30); 
      if (frameLength < 30) { 
       System.err.println("Not enough frames"); 
      } 

      IplImage[] faceImgArr = new IplImage[30]; 

      /* Ensure we don't go past end of video and get at least 30 frames */ 
      for (int i = 0, j = 0; i < frameLength && j <= 30; i += increment, j++) { 
       try { 
        if ((grabber.getFrameNumber() % increment) == 0) { 
         faceImgArr[j] = grabber.grab(); 
        } else { 
         grabber.grabFrame(); 
        } 
       } catch (Exception e) { 
        System.err.println("Error grabbing frame"); 
       } 
      } 

      return faceImgArr; 
     } 

    } 

Error Message: 
# A fatal error has been detected by the Java Runtime Environment: 
# 
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000066de1630, pid=1328, tid=7016 
# 
# JRE version: 6.0_32-b05 
# Java VM: Java HotSpot(TM) 64-Bit Server VM (20.7-b02 mixed mode windows-amd64 compressed oops) 
# Problematic frame: 
# C [opencv_ffmpeg242_64.dll+0x5a1630] 
# 
# An error report file with more information is saved as: 
# C:\Users\name\workspace\Video\hs_err_pid1328.log 
# 


Snippet from log: 
Stack: [0x0000000002900000,0x0000000002a00000], sp=0x00000000029fec30, free space=1019k 
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) 
C [opencv_ffmpeg242_64.dll+0x5a1630] cvWriteFrame_FFMPEG+0x59e2b0 

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code) 
j com.googlecode.javacv.cpp.opencv_highgui.cvCreateFileCapture(Ljava/lang/String;)Lcom/googlecode/javacv/cpp/opencv_highgui$CvCapture;+0 
j com.googlecode.javacv.OpenCVFrameGrabber.start()V+22 
j main.recognition.VideoTest.extractVideoFrames(Ljava/lang/String;)[Lcom/googlecode/javacv/cpp/opencv_core$IplImage;+10 
j main.recognition.VideoTest.main([Ljava/lang/String;)V+11 
v ~StubRoutines::call_stub 

回答

5

因变量走出去的范围Javacv代码通常访问冲突发生(JNI的行为与正常情况有点不同。请参考这个职位,我如何解决我的访问冲突http://tech.thecoolblogs.com/2012/10/exceptionaccessviolation-while-using.html

为了解决你的问题,首先尝试在一个单一范围内的整个代码..我的意思是在一种方法,并在一个尝试.. catch块。如果这有效,我们可以认为这个问题显然与某些变量超出范围有关。然后尝试围绕IplImage创建,看看它是否消失。

如果仍然没有工作(在合并到相同的方法和范围之后),请检查临时文件夹(C:\ users \ ur id \ AppData \ Local \ Temp \ javacpp **文件夹以查看dll文件通过

复制