2012-11-26 1 views
1

모두 :JavaCV에서 프레임 캡처 중 오류가 발생했습니다.

32 비트 Java 및 32 비트 OpenCV 2.4.3을 사용하는 Windows XP (32 비트)를 실행하고 있습니다.

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 

다음 오류가 발생합니다 : 이클립스에서 코드를 다음과 함께 AVI의 비디오 프레임을 캡처하려고

을 ================= ========= 치명적인 오류가 자바에 의해 발견되었습니다

오류 =========================의 시작 런타임 환경 :

EXCEPTION_ACCESS_VIOLATION의 PC에서 (가 0xc0000005) = 0x77c46fa3, PID = 4776, TID = 3392

JRE 버전 : 7.0_02-B13 자바 VM : 자바 핫스팟 (TM) 클라이언트 VM (22.0-B10 혼합 모드, 공유 윈도우 86) 애로 프레임 : C [MSVCRT.DLL는 0x36fa3는 +]

실패 코어 덤프를 작성합니다. C : 미니 덤프는 자세한 정보와 오류 보고서 파일로 저장됩니다

윈도우

의 클라이언트 버전에서 기본적으로 사용할 수 없습니다 \ 자바 프로젝트 \ JavaCVTester \ hs_err_pid4776.log

당신은 버그를 제출하려는 경우 신고 : http://bugreport.sun.com/bugreport/crash.jsp Java 가상 머신 외부에서 기본 코드로 충돌이 발생했습니다. 버그를보고 할 위치가 문제가되는 프레임을 참조하십시오.

==================== 오류 메시지의 끝 ==================

누군가이 문제에 대해 저를 도울 수 있습니까?

미리 감사드립니다.

+0

대신에 [는 FFmpeg (http://ffmpeg.org/download.html)와'FFmpegFrameGrabber'로 시도하십시오. –

답변

0

은 JRE를 다시 설치하십시오. 는 또한 윈도우 시작 & 복구 옵션을 고토. "메모리 덤프 완료"에 "디버깅 쓰기 옵션"을 선택하십시오.

0

OpenCVFrameGrabber은 많은 비디오 포맷을 지원하지 않습니다. "[...] 문제가있는 프레임 : C [msvcrt.dll + 0x36fa3] [...]"라는 오류 메시지는 비디오 형식이 지원되지 않을 수 있음을 지적합니다.

FFmpegFrameGrabber은 더 유연합니다. 다음 코드를 사용해보십시오 : JavaCV에서

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

을, 당신은 OpenCVFrameGrabber의 래퍼입니다 FFmpegFrameGrabber을 사용할 수 있으며 오히려 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); 

    } 
} 
관련 문제