1. We have moved from vBulletin to XenForo and you are viewing the site in the middle of the move. Though the functional aspect of everything is working fine, we are still working on other changes including the new design on Xenforo.
    Dismiss Notice

Face detection program help with bug

Discussion in 'C' started by meepokman, Jun 17, 2010.

  1. meepokman

    meepokman New Member

    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:

Share This Page