Hi guys, I'm currently trying to produce a facial detection application, but I seem to have some problems. My program, is able to recognise multiple users, and match their captured image to one saved in the database. However, if a person who has not registered is photographed, it is supposed open a pop-up of a picture of my choosing (in the code below I've chosen a picture of Mario) and tell the user that he/she is not in the database. The code for the condition of both recognizing and showing an unrecognised user is below.
The problem I have, is that when an unrecognised user is captured, it will still show user 1 or 2, instead of a "Mario" image. I'm unsure if it is the recognition algorithm (code also below) or my "if" statement that is at fault. I'm now trying with only 2 users to minimize the chance of errors. Can anyone help?
void CzebraDlg::OnBnClickedCapturetrain()
{
else if( LearnOrRecognize == 2) // CASE 2 (CAPTURE FOR RECOGNIZE)
{
sprintf(PicFname, "%s", "test.jpg");
sprintf(TestFname, "%s", "test.txt");
ofstream outfile; //An object:myfile of type "ofstream" is created to allow the file to be opened for writing
outfile.open(TestFname, ios::app);
char *temp = new char[50];
sprintf(temp, "%s", "1 test.jpg");
outfile << temp <<endl;
cvSaveImage(PicFname, gregion);
recognize();
IplImage* Identified_Person_Img;
if (RESULT_NEAREST == 1) //Nearest refers to ID of person being recognized
{
cvNamedWindow( "ID01", 0 );
cvResizeWindow( "ID01", 160, 160 );
cvMoveWindow( "ID01", 673, 506 );
Identified_Person_Img = cvLoadImage( "D:\\FYP\\01\\1.jpg", 1 );
cvShowImage("ID01", Identified_Person_Img);
EEE(node_number=0); //meant for hardware interfacing, not used
}
if (RESULT_NEAREST !=1)
{
if (RESULT_NEAREST == 2)
{
cvNamedWindow( "ID02", 0 );
cvResizeWindow( "ID02", 160, 160 );
cvMoveWindow( "ID02", 673, 506 );
Identified_Person_Img = cvLoadImage( "D:\\FYP\\02\\1.jpg", 1 );
cvShowImage("ID02", Identified_Person_Img);
EEE(node_number=1);
}
}
if (!(RESULT_NEAREST == 1) && !(RESULT_NEAREST == 2))
{
cvNamedWindow( "Unknown Face Detected", 0 );
cvResizeWindow( "Unknown Face Detected", 160, 160 );
cvMoveWindow( "Unknown Face Detected", 673, 506 );
IplImage* UnknownFace;
UnknownFace = cvLoadImage( "D:\\FYP\\MARIO1.jpg", 1 );
IplImage *FUnknownFace = 0;
FUnknownFace = cvCreateImage(cvSize(160, 160),
UnknownFace->depth, UnknownFace->nChannels);
cvResize( UnknownFace, FUnknownFace, CV_INTER_LINEAR );
cvShowImage("Unknown Face Detected", FUnknownFace);
EEE(node_number=20);
}
outfile.close();
}
}
Recognition function is below for reference and error checking.
void recognize()
{
int i, nTestFaces = 0; // the number of test images
CvMat * trainPersonNumMat = 0; // the person numbers during training
float * projectedTestFace = 0;
// load test images and ground truth for person number
nTestFaces = loadFaceImgArray("test.txt");
// load the saved training data
if( !loadTrainingData( &trainPersonNumMat ) ) return;
// project the test images onto the PCA subspace
projectedTestFace = (float *)cvAlloc( nEigens*sizeof(float) );
int iNearest, nearest, truth;
for(i=0; i<nTestFaces; i++)
{
// project the test image onto the PCA subspace
cvEigenDecomposite
(
faceImgArr[i],
nEigens,
eigenVectArr,
0, 0,
pAvgTrainImg,
projectedTestFace);
iNearest = findNearestNeighbor(projectedTestFace);
truth = personNumTruthMat->data.i[i];
nearest = trainPersonNumMat->data.i[iNearest];
}
RESULT_NEAREST = nearest;
RESULT_TRUTH = truth;
}
Function that gives values to the one above's code is below
int findNearestNeighbor(float * projectedTestFace)
{
double leastDistSq = DBL_MAX;
int i, iTrain, iNearest = 0;
for(iTrain=0; iTrain<nTrainFaces; iTrain++)
{
double distSq=0;
for(i=0; i<nEigens; i++)
{
float d_i =
projectedTestFace[i] -
projectedTrainFaceMat->data.fl[iTrain*nEigens + i];
distSq += d_i*d_i / eigenValMat->data.fl[i];
}
if(distSq < leastDistSq)
{
leastDistSq = distSq;
iNearest = iTrain;
}
}
return iNearest;
}
I'm using MFC for the GUI creation, but I don't think that should be a problem as of now. Thanks a lot for any help in advance. If you need to see the entire .cpp file that these snippets came from, I have attached it as well.