2012-05-05 4 views
3
나는 배경 공제/전경 추출을위한 FGD 알고리즘을 구현하기 위해 노력하고 opencv2.3.1 및 Visual Studio 2010

OpenCV의 : 배경 뺄셈 : 액세스 위반

을 사용하고

#include "opencv/cvaux.h" 
#include "opencv2/opencv.hpp" 
#include "opencv2/opencv_modules.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/video/background_segm.hpp" 
#include "opencv2/video/tracking.hpp" 
#include "opencv2/video/video.hpp" 
#include "opencv2/features2d/features2d.hpp" 
#include "ctype.h" 
#include "stdio.h" 

int main(int argc, char* argv[]) 
{ 

    /* Start capturing */ 
    CvCapture* capture = 0; 

    /*//Capture from CAM 
    if(argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0]))) 
    capture = cvCaptureFromCAM(argc == 2 ? argv[1][0] - '0' : 0); 
    else if(argc == 2)*/ 

    capture = cvCaptureFromAVI("pool.avi" ); 

    if(!capture) 
    { 
     fprintf(stderr,"Could not initialize...\n"); 
     return -1; 
    } 

    /* Capture 1 video frame for initialization */ 
    IplImage* videoFrame = NULL; 

    videoFrame = cvQueryFrame(capture); 

    if(!videoFrame) 
    { 
     printf("Bad frame \n"); 
     exit(0); 
    } 

    // Create windows 
    cvNamedWindow("BG", 1); 
    cvNamedWindow("FG", 1); 
    //cvNamedWindow("Blobs", 1); 
    //cvNamedWindow("Contours",1); 

    // Select parameters for Gaussian model. 
    CvFGDStatModelParams* params = new CvFGDStatModelParams; 
    params->Lcc=64; /* Quantized levels per 'color co-occurrence' component. Power of two, typically 16, 32 or 64.   */ 
    params->N1cc=25; /* Number of color co-occurrence vectors used to model normal background color variation at a given pixel. */ 
    params->N2cc=40; /* Number of color co-occurrence vectors retained at given pixel. Must be > N1cc, typically ~ 5/3 of N1cc. */ 
    /* Used to allow the first N1cc vectors to adapt over time to changing background.    */ 
    params->is_obj_without_holes=TRUE; /* If TRUE we ignore holes within foreground blobs. Defaults to TRUE.      */ 
    params->perform_morphing=1;/* Number of erode-dilate-erode foreground-blob cleanup iterations.      */ 
    /* These erase one-pixel junk blobs and merge almost-touching blobs. Default value is 1.   */ 
    params->alpha1=0.1; /* How quickly we forget old background pixel values seen. Typically set to 0.1    */ 
    params->alpha2=0.005; /* "Controls speed of feature learning". Depends on T. Typical value circa 0.005.     */ 
    params->alpha3=0.1; /* Alternate to alpha2, used (e.g.) for quicker initial convergence. Typical value 0.1.    */ 
    params->delta=2; /* Affects color and color co-occurrence quantization, typically set to 2.     */ 
    params->T=0.9; /* "A percentage value which determines when new features can be recognized as new background." (Typically 0.9).*/ 
    params->minArea=15; /* Discard foreground blobs whose bounding box is smaller than this threshold.     */ 

    CvBGStatModel* bgModel = cvCreateFGDStatModel(videoFrame ,params); 

    //Write FG in a file 
    CvVideoWriter *writer = 0; 
    int isColor = 1; 
    int fps  = 25; 
    int frameW = 640; 
    int frameH = 480; 
    writer=cvCreateVideoWriter("out.avi",CV_FOURCC('D', 'I', 'V', 'X'), 
          fps,cvSize(frameW,frameH),isColor); 


    int key=-1; 
    while(key != 'q') 
    { 
     // Grab a fram 
     videoFrame = cvQueryFrame(capture); 

     if(!videoFrame) 
      { 
      break;} 

     // Update model 
     cvUpdateBGStatModel(videoFrame,bgModel); 

     // Display results 
     cvShowImage("BG", bgModel->background); 
     cvShowImage("FG", bgModel->foreground); 

    // Write foreground in AVI formet 
    cvWriteFrame(writer,bgModel->foreground); 

     key = cvWaitKey(10); 
    } 

    cvDestroyWindow("BG"); 
    cvDestroyWindow("FG"); 
    //cvDestroyWindow("Blobs"); 
    //cvDestroyWindow("Contours"); 

    cvWaitKey(0); 

    cvReleaseBGStatModel(&bgModel); 
    cvReleaseCapture(&capture); 
    cvReleaseVideoWriter(&writer); 

    return 0; 
} 

.

이미 MOG 알고리즘을 성공적으로 구현했습니다. 그런 다음 함수와 매개 변수를 MOG에서 FGD로 변경합니다.

프로젝트가 Visual Studio에서 성공적으로 컴파일되었지만 기능 상 : cvShowImage ("BG", bgModel-> background); hello_opencv_231.exe에 0x000007feef085d09에서

처리되지 않은 예외 : 는 다음과 같은 오류를 제공가 0xc0000005 : 액세스 위반 쓰기 위치 0xfffffffcc40b40e0을.

나는 이것이 무엇인지 모른다 ... 어떤 아이디어?

도움 주셔서 감사합니다.

답변

3

존재하지 않는 위치에 액세스하려고하면 오류 액세스 위반이 나타납니다. 예를 들어, Mat (3,1, CV_32FC1)의 위치 4에 액세스 할 때 발생합니다. 또는 호환되지 않는 크기의 두 행렬 Mat (3,1, CV_32FC1) x Mat (3,1, CV_32FC1)을 곱하면됩니다.

코드를 단계별로 디버깅하십시오 (Visual Studio의 F10). 충돌이 발생하면 정확한 줄을 알 수 있으므로 정확히 액세스 위반을 일으키는 원인을 분석 할 수 있습니다.