繁体   English   中英

在处理语言中使用OpenCV时EXCEPTION_ACCESS_VIOLATION(0xc0000005)

[英]EXCEPTION_ACCESS_VIOLATION (0xc0000005) while using OpenCV in Processing language

我的处理代码如下。

import hypermedia.video.*;
import processing.video.*;
import java.awt.Rectangle;

OpenCV opencv;

int width = 320;
int height = 240;

void setup() {

size( 320, 240 ); //set window size

opencv = new OpenCV( this ); //setup openCV
opencv.capture( width, height ); // open video stream
opencv.cascade( OpenCV.CASCADE_FRONTALFACE_ALT );
}

void draw(){
opencv.read();
image(opencv.image(), 0, 0);
Rectangle[] faces = opencv.detect( 1.2, 2, OpenCV.HAAR_DO_CANNY_PRUNING, 40, 40 );
noFill();
  stroke(255,0,0);
  for( int i=0; i<faces.length; i++ ) {
    rect( faces[i].x, faces[i].y, faces[i].width, faces[i].height );
  }
}

这段代码工作了几秒钟,然后发生了异常。

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d961b22, pid=232, tid=4008
#
# JRE version: 6.0_33-b03
# Java VM: Java HotSpot(TM) Client VM (20.8-b03 mixed mode windows-x86 )
# Problematic frame:
# V  [jvm.dll+0xa1b22]
#
# An error report file with more information is saved as:
# C:\Documents and Settings\Administrator\Desktop\processing-2.0b7\hs_err_pid232.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#

我认为这是opencv_core.CvMemStorage的内存分配问题。 这是您的库中未公开的类。 我有同样的问题。 我使用的是javacv(直接而不是javacvpro),因为我想运行多个haar级联(只能使用javacvpro或较旧的hypermedia.video。*加载一个)。 如果我在每个框架上都运行它们,那很好。 如果我在每个帧上运行不同的检测器(然后再次通过检测器循环),则在几个循环后出现此错误。

FAILS下面的代码段,但这是我想要做的(用不同的检测器处理每个后续帧):

// Using JavaCV directly, not JavaCVPro!
import com.googlecode.javacpp.Loader;
import com.googlecode.javacv.*;
import com.googlecode.javacv.*;
import com.googlecode.javacv.cpp.*;
String cascades[] = {
  "haarcascade_eye.xml",            // 0
  "haarcascade_eye_tree_eyeglasses.xml",    // 1
  "haarcascade_frontalface_alt.xml"      // 2
}
int detectors[] = {1,3};
// haar detectors to use

String cascPath = "C:/opencv/data/haarcascades/";
// preload multiple classifiers. can do this with javacvpro, not with javacv or hypermedia.video.*

void haarSetup() {
    for (int i = 0; i < detectors.length; i++) {
      String classifierFile = cascPath+cascades[detectors[i]];
      classifier[i] = 
        new opencv_objdetect.CvHaarClassifierCascade(opencv_core.cvLoad(classifierFile));
    }
    storage = opencv_core.CvMemStorage.create();
    opencv_core.cvClearMemStorage(storage); // is this needed? couldn't hurt, right?
}

// contains list of preloaded haar cascades. code not included here...
opencv_core.CvSeq features[] = new opencv_core.CvSeq[detectors.length];
int whichHaar = 0;

// run one cascade per frame, then cycle through them.
void processHaars(PImage piz) {
  // convert to IplImage...  
  BufferedImage imgBuf = (BufferedImage) piz.getNative();    
  opencv_core.IplImage iplImgOut=opencv_core.IplImage.createFrom(imgBuf);
  // do one haar cascade per invocation.
  int ii = whichHaar;
  features[ii] = opencv_objdetect.cvHaarDetectObjects(iplImgOut, classifier[ii], storage, 1.1, 3, opencv_objdetect.CV_HAAR_DO_CANNY_PRUNING);
  whichHaar++;
  if (whichHaar >= detectors.length){
    whichHaar = 0;
    // is THIS causing the problem??
    opencv_core.cvClearMemStorage(storage);
  }
}

这个代码片段永远有效,但是我不想要它做什么(在单个帧上运行所有检测器):

void processHaars(PImage piz) {
// convert to IplImage...  
BufferedImage imgBuf = (BufferedImage) piz.getNative();    
opencv_core.IplImage iplImgOut=opencv_core.IplImage.createFrom(imgBuf);

for (ii=0; ii<detectors.length; ii++)
    faces[ii] = opencv_objdetect.cvHaarDetectObjects(iplImgOut, classifier[ii], storage, 1.1, 3, opencv_objdetect.CV_HAAR_DO_CANNY_PRUNING);

opencv_core.cvClearMemStorage(storage);
}

如果我找到完整的解决方案,我将其发布。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM