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?

Code:
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.

Code:
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

Code:
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.
Attached Files
File Type: doc zebraDlg.doc (127.0 KB, 4 views)