Face detection program help with bug

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

  1. meepokman

    meepokman New Member

    Joined:
    Jun 17, 2010
    Messages:
    1
    Likes Received:
    0
    Trophy Points:
    0
    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

  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice