1

だから私はJavaCVを使用していて、mp4ファイルからフレームを画像としてキャプチャしようとしています。画像を保存しようとすると EXCEPTION_ACCESS_VIOLATION が発生し続け、どこにも解決策を見つけることができませんでした。OpenCV、JavaCV、および Java はすべて同じビット数 (64) です。また、64 ビットの Visual C++ もインストールされています。これは、何が原因であるか、または代替ソリューションが何であるかについて、私が使用しているコードです。事前にご協力いただきありがとうございます。

      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
4

1 に答える 1

4

通常、変数がスコープ外になるため、Javacv コードでアクセス違反が発生します (JNI は通常のケースとは少し異なる動作をします。アクセス違反を解決した方法については、この投稿を参照してくださいhttp://tech.thecoolblogs.com/2012/10/exceptionaccessviolation -while-using.html )

問題を解決するには、まず 1 つのスコープでコード全体を試してください。それが機能する場合、この問題は明らかに範囲外の変数に関連していると推測できます。次に、IplImage の作成中を移動してみて、それがなくなるかどうかを確認します。

それでも機能しない場合 (同じメソッドとスコープにマージした後)、一時フォルダー (C:\users\ur id\AppData\Local\Temp\javacpp** フォルダーをチェックして、dll ファイルがコピーされているかどうかを確認してください)

于 2012-11-01T14:46:40.547 に答える