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

Я пытаюсь обучить 7 текстовых файлов, которые будут генерировать 7 XML-файлов в качестве вывода. Следовательно, я пробовал через цикл for, который будет функционировать 7 раз.

Я сослался на следующую ссылку для распознавания лиц
Распознавание лиц онлайн с использованием 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

Решение

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

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

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

Хотя, думая об этом, это все равно неэффективно.

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

Здесь слишком много дублирования кода.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]