2013-04-12 2 views
-2

Я пытаюсь подготовить 7 текстовых файлов, которые будут генерировать 7 xml-файлов в качестве вывода. Поэтому я пробовал через «цикл цикла», который будет работать 7 раз.Необработанное исключение в 0x00cd2e34 в Detect.exe: 0xC0000005: местоположение чтения нарушения доступа 0x00000000

Я передал следующую ссылку для распознавания лица Online Face Recognition using OpenCV

я получаю сообщение об ошибке при выполнении кода: Необработанного исключения в 0x00cd2e34 в Detect.exe: 0xC0000005: нарушение прав доступа для чтения расположения 0x00000000.

Цените свою поддержку в этом отношении. Благодаря!

код связан с ошибкой и цикл:

void learn() { 
    int offset; 
    for(int i=0; i<=7; i++){ 
     if (i==1){ 
      //first text file 
      // load training data from Diamond.txt 
      nTrainFaces = loadFaceImgArray("Diamond.txt"); 
      if(nTrainFaces <2) 
      { 

       fprintf(stderr, 
       "Need 2 or more training faces\n" 
       "Input file contains only %d\n", nTrainFaces); 

       return; 
      } 
     } 

     if (i==2){ 
      //the next text file 
      // load training data from Heart.txt 
      nTrainFaces = loadFaceImgArray("Heart.txt"); 
      if(nTrainFaces <2) 
      { 

       fprintf(stderr, 
       "Need 2 or more training faces\n" 
       "Input file contains only %d\n", nTrainFaces); 

       return; 
      } 
     } 

     if (i==3){ 
      //the next text file 
      // load training data from Square.txt 
      nTrainFaces = loadFaceImgArray("Square.txt"); 
      if(nTrainFaces <2) 
      { 

       fprintf(stderr, 
       "Need 2 or more training faces\n" 
       "Input file contains only %d\n", nTrainFaces); 

       return; 
      } 
     } 

     if (i==4){ 
      //the next text file 
      // load training data from Oblong.txt 
      nTrainFaces = loadFaceImgArray("Oblong.txt"); 
      if(nTrainFaces <2) 
      { 

       fprintf(stderr, 
       "Need 2 or more training faces\n" 
       "Input file contains only %d\n", nTrainFaces); 

       return; 
      } 
     } 

     if (i==5){ 
      //the next text file 
      // load training data from Oval.txt 
      nTrainFaces = loadFaceImgArray("Oval.txt"); 
      if(nTrainFaces <2) 
      { 

       fprintf(stderr, 
       "Need 2 or more training faces\n" 
       "Input file contains only %d\n", nTrainFaces); 

       return; 
      } 
     } 

     if (i==6){ 
      //the next text file 
      // load training data from Round.txt 
      nTrainFaces = loadFaceImgArray("Round.txt"); 
      if(nTrainFaces <2) 
      { 

       fprintf(stderr, 
       "Need 2 or more training faces\n" 
       "Input file contains only %d\n", nTrainFaces); 

       return; 
      } 
     } 

     if (i==7){ 
      //the next text file 
      // load training data from Triangle.txt 
      nTrainFaces = loadFaceImgArray("Triangle.txt"); 
      if(nTrainFaces <2) 
      { 

       fprintf(stderr, 
       "Need 2 or more training faces\n" 
       "Input file contains only %d\n", nTrainFaces); 

       return; 
      } 
     } 


     // do PCA on the training faces 
     doPCA(); 

     // project the training images onto the PCA subspace       
     projectedTrainFaceMat = cvCreateMat(nTrainFaces, nEigens, CV_32FC1); 
     offset = projectedTrainFaceMat->step/sizeof(float); 
     for(int i=0; i<nTrainFaces; i++) 
     { 
      //int offset = i * nEigens; 
      cvEigenDecomposite(
      faceImgArr[i], 
      nEigens, 
      eigenVectArr, 
      0, 0, 
      pAvgTrainImg, 
      //projectedTrainFaceMat->data.fl + i*nEigens); 
      projectedTrainFaceMat->data.fl + i*offset); 
     } 
     // store the recognition data as an xml file 
     storeTrainingData(); 
    } 
} 


void doPCA() { 
    int i; 
    faceImgArr  = 0; 
    CvTermCriteria calcLimit; 
    CvSize faceImgSize; 

    // set the number of eigenvalues to use 
    nEigens = nTrainFaces-1; 

    // allocate the eigenvector images 
    faceImgSize.width = faceImgArr[0]->width; // I GET THE ERROR HERE 
    faceImgSize.height = faceImgArr[0]->height; 
    eigenVectArr = (IplImage**)cvAlloc(sizeof(IplImage*) * nEigens); 
    for(i=0; i<nEigens; i++) 
    eigenVectArr[i] = cvCreateImage(faceImgSize, IPL_DEPTH_32F, 1); 

    // allocate the eigenvalue array 
    eigenValMat = cvCreateMat(1, nEigens, CV_32FC1); 

    // allocate the averaged image 
    pAvgTrainImg = cvCreateImage(faceImgSize, IPL_DEPTH_32F, 1); 

    // set the PCA termination criterion 
    calcLimit = cvTermCriteria(CV_TERMCRIT_ITER, nEigens, 1); 

    // compute average image, eigenvalues, and eigenvectors 
    cvCalcEigenObjects(
    nTrainFaces, 
    (void*)faceImgArr, 
    (void*)eigenVectArr, 
    CV_EIGOBJ_NO_CALLBACK, 
    0, 
    0, 
    &calcLimit, 
    pAvgTrainImg, 
    eigenValMat->data.fl); 

    cvNormalize(eigenValMat, eigenValMat, 1, 0, CV_L1, 0); 
} 

void storeTrainingData() { 
    for(int i=0;i<=7;i++){ 
     CvFileStorage * fileStorage; 
     if (i==1){ 
      // create a file-storage interface 
      fileStorage = cvOpenFileStorage("Diamond.xml", 0, CV_STORAGE_WRITE); 

     } 

     if (i==2){ 
      // create a file-storage interface 
      fileStorage = cvOpenFileStorage("Heart.xml", 0, CV_STORAGE_WRITE); 

     } 


     if (i==3){ 
      // create a file-storage interface 
      fileStorage = cvOpenFileStorage("Square.xml", 0, CV_STORAGE_WRITE); 

     } 

     if (i==4){ 
      // create a file-storage interface 
      fileStorage = cvOpenFileStorage("Oblong.xml", 0, CV_STORAGE_WRITE); 

     } 

     if (i==5){ 
      // create a file-storage interface 
      fileStorage = cvOpenFileStorage("Oval.xml", 0, CV_STORAGE_WRITE); 

     } 

     if (i==6){ 
      // create a file-storage interface 
      fileStorage = cvOpenFileStorage("Round.xml", 0, CV_STORAGE_WRITE); 

     } 
     if (i==7){ 
      // create a file-storage interface 
      fileStorage = cvOpenFileStorage("Triangle.xml", 0, CV_STORAGE_WRITE); 

     } 


     // store all the data 
     cvWriteInt(fileStorage, "nEigens", nEigens); 
     cvWriteInt(fileStorage, "nTrainFaces", nTrainFaces); 
     cvWrite(fileStorage, "trainPersonNumMat", personNumTruthMat, cvAttrList(0,0)); 
     cvWrite(fileStorage, "eigenValMat", eigenValMat, cvAttrList(0,0)); 
     cvWrite(fileStorage, "projectedTrainFaceMat", projectedTrainFaceMat, cvAttrList(0,0)); 
     cvWrite(fileStorage, "avgTrainImg", pAvgTrainImg, cvAttrList(0,0)); 
     for(int i=0; i<nEigens; i++) 
     { 
      char varname[200]; 
      sprintf(varname, "eigenVect_%d", i); 
      cvWrite(fileStorage, varname, eigenVectArr[i], cvAttrList(0,0)); 
     } 

     // release the file-storage interface 
     cvReleaseFileStorage(&fileStorage); 

    } 
} 

int loadTrainingData(CvMat ** pTrainPersonNumMat) { 
    CvFileStorage * fileStorage; 

    for(int i=0;i<=7;i++){ 
     if (i==1){ 
      // create a file-storage interface 
      fileStorage = cvOpenFileStorage("Diamond.xml", 0, CV_STORAGE_READ); 
      if(!fileStorage) 
      { 
       fprintf(stderr, "Can't open Diamond.xml\n"); 
       return 0; 
      } 
     } 

     if (i==2){ 
      // create a file-storage interface 
      fileStorage = cvOpenFileStorage("Heart.xml", 0, CV_STORAGE_READ); 
      if(!fileStorage) 
      { 
       fprintf(stderr, "Can't open Diamond.xml\n"); 
       return 0; 
      } 
     } 

     if (i==3){ 
      // create a file-storage interface 
      fileStorage = cvOpenFileStorage("Square.xml", 0, CV_STORAGE_READ); 
      if(!fileStorage) 
      { 
       fprintf(stderr, "Can't open Diamond.xml\n"); 
       return 0; 
      } 
     } 

     if (i==4){ 
      // create a file-storage interface 
      fileStorage = cvOpenFileStorage("Oblong.xml", 0, CV_STORAGE_READ); 
      if(!fileStorage) 
      { 
       fprintf(stderr, "Can't open Diamond.xml\n"); 
       return 0; 
      } 
     } 

     if (i==5){ 
      // create a file-storage interface 
      fileStorage = cvOpenFileStorage("Oval.xml", 0, CV_STORAGE_READ); 
      if(!fileStorage) 
      { 
       fprintf(stderr, "Can't open Diamond.xml\n"); 
       return 0; 
      } 
     } 

     if (i==6){ 
      // create a file-storage interface 
      fileStorage = cvOpenFileStorage("Square.xml", 0, CV_STORAGE_READ); 
      if(!fileStorage) 
      { 
       fprintf(stderr, "Can't open Diamond.xml\n"); 
       return 0; 
      } 

     } 

     if (i==7){ 
      // create a file-storage interface 
      fileStorage = cvOpenFileStorage("Triangle.xml", 0, CV_STORAGE_READ); 
      if(!fileStorage) 
      { 
       fprintf(stderr, "Can't open Diamond.xml\n"); 
       return 0; 
      } 
     } 


     nEigens = cvReadIntByName(fileStorage, 0, "nEigens", 0); 
     nTrainFaces = cvReadIntByName(fileStorage, 0, "nTrainFaces", 0); 
     *pTrainPersonNumMat = (CvMat *)cvReadByName(fileStorage, 0, "trainPersonNumMat", 0); 
     eigenValMat = (CvMat *)cvReadByName(fileStorage, 0, "eigenValMat", 0); 
     projectedTrainFaceMat = (CvMat *)cvReadByName(fileStorage, 0, "projectedTrainFaceMat", 0); 
     pAvgTrainImg = (IplImage *)cvReadByName(fileStorage, 0, "avgTrainImg", 0); 
     eigenVectArr = (IplImage **)cvAlloc(nTrainFaces*sizeof(IplImage *)); 
     for(int i=0; i<nEigens; i++) 
     { 
      char varname[200]; 
      sprintf(varname, "eigenVect_%d", i); 
      eigenVectArr[i] = (IplImage *)cvReadByName(fileStorage, 0, varname, 0); 
     } 

     // release the file-storage interface 
     cvReleaseFileStorage(&fileStorage); 

     return 1; 
    } 
} 
+2

Ваша петля бессмысленна; вы все еще повторяетесь для каждой итерации. Вы также можете удалить цикл (или, еще лучше, понять их и сохранить имена файлов в какой-то коллекции, итерации по этому поводу). –

+2

Ваш цикл сбой, когда i == 0, потому что fileStorage не будет назначен. –

+1

Я бы рекомендовал использовать отладчик, чтобы выполнить ваш код (или минимально вставлять заявления печати), чтобы помочь сузить место происшествия. Просто публикация большого блоха неполного кода, подобного этому, вряд ли даст полезные ответы. Хотя большой блоб, потенциально релевантные фрагменты кода, такие как некоторые определения переменных, не включены. Например, nTrainFaces не определяется. – statueuphemism

ответ

1

Ваш цикл внутри storeTrainingData вызовет сбой, потому что, когда я == 0, не будет открыт ни один файл, и все же вы называете cvWriteInt на пустой ручкой.

Это должно исправить:

for(int i=1; i<=7; i++) 

Хотя думать об этом, это еще отчасти неэффективным.

Я думаю, что нужно учиться на начиная с нуля, а не 1, индексации вещей и т.д.

Существует слишком много кода дублирования здесь.