コード例 #1
0
	bool EigenfaceRecognizer::train()
	{
		isTrained = false;

		if(!loadTrainingImages())
			return false;

		//do principal component analysis
		doPCA();

		// project the training images onto the PCA subspace
		projectedTrainImage = cvCreateMat( numTrainedImages, numEigenvalues, CV_32FC1 );
	
		int offset = projectedTrainImage->step / sizeof(float);
	
		for(int i = 0; i < numTrainedImages; i++)
		{
			//int offset = i * nEigens;
			cvEigenDecomposite(
				images[i],
				numEigenvalues,
				eigenVectors,
				0, 0,
				averageImage,
				//projectedTrainFaceMat->data.fl + i*nEigens);
				projectedTrainImage->data.fl + i*offset);
		}

		isTrained = true;

		return isTrained;
	}
コード例 #2
0
ファイル: facerecog.cpp プロジェクト: ankitC/javaBkup
void learn()
{
 int i;
 
 // load training data
 nTrainFaces = loadFaceImgArray("train.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();
 printf("Starting Matrix creation.\n");
 // project the training images onto the PCA subspace
 projectedTrainFaceMat = cvCreateMat(nTrainFaces, nEigens, CV_32FC1);
 printf("Entering for loop.\n");
 for(i=0; i<nTrainFaces; i++)
 {
 cvEigenDecomposite(
 faceImgArr[i],
 nEigens,
 eigenVectArr,
 0, 0,
 pAvgTrainImg,
 projectedTrainFaceMat->data.fl + i*nEigens);
 }
 // store the recognition data as an xml file
 storeTrainingData();
}
コード例 #3
0
/**
 * 顔を学習する
 */
void EigenFace::learn(char* trainFileName)
{
	int i, offset;
  
	// load training data
	nTrainFaces = loadFaceImgArray(trainFileName);
	if( nTrainFaces < 2 )
	{
		LOGE("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(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();
}
コード例 #4
0
//////////////////////////////////
// learn()
//
void  faceRecognition::learn()
{   
	AfxMessageBox("训练人脸识别模型");
	int i, offset;
	// load training data
	nTrainFaces = loadFaceImgArray(learnFileListPath);
	if( nTrainFaces < 2){
		CString S;
		S.Format("Need 2 or more training faces\nInput file contains only %d\n", nTrainFaces);AfxMessageBox(S);    return;
	    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(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();
}
コード例 #5
0
ファイル: MTT.cpp プロジェクト: gnishida/Morph
/**
 * 頂点を、順番にcollapseしていく。
 * ただし、当該頂点から出るエッジの長さが短いものから、優先的にcollapseしていく。
 */
void MTT::collapse(RoadGraph* roads, float w1, float w2, float w3, std::vector<RoadGraph*>* sequence) {
	qDebug() << "collapse start.";

	PCA pca;
	doPCA(roads, pca);

	RoadVertexDesc bdry1_desc, bdry2_desc;
	findBoundaryVertices(roads, bdry1_desc, bdry2_desc);

	while (true) {
		int count = 0;

		sequence->push_back(GraphUtil::copyRoads(roads));

		float min_metric = std::numeric_limits<float>::max();
		RoadVertexDesc min_v_desc1;	// to be collapsed to the other one
		RoadVertexDesc min_v_desc2;

		RoadEdgeIter ei, eend;
		for (boost::tie(ei, eend) = boost::edges(roads->graph); ei != eend; ++ei) {
			if (!roads->graph[*ei]->valid) continue;

			count++;

			RoadVertexDesc src = boost::source(*ei, roads->graph);
			RoadVertexDesc tgt = boost::target(*ei, roads->graph);

			if (bdry2_desc == src || bdry2_desc == tgt) {
				int k = 0;
			}

			float metric = getMetric(roads, src, tgt, w1, w2, w3, pca);		
			if (metric < min_metric) {
				min_metric = metric;
				min_v_desc1 = src;
				min_v_desc2 = tgt;
			}

			metric = getMetric(roads, tgt, src, w1, w2, w3, pca);		
			if (metric < min_metric) {
				min_metric = metric;
				min_v_desc1 = tgt;
				min_v_desc2 = src;
			}
		}

		if (count <= 1) break;

		// 頂点min_v_desc1を、min_v_desc2へcollapseする
		GraphUtil::collapseVertex(roads, min_v_desc1, min_v_desc2);
	}

	qDebug() << "collapse done.";
}
コード例 #6
0
// Train from the data in the given text file, and store the trained data into the file 'facedata.xml'.
void learn(char szFileTrain[252])
{
    int i, offset;
    
    
    // load training data
    printf("Loading the training images in '%s'\n", szFileTrain);
    nTrainFaces = loadFaceImgArray(szFileTrain);
    printf("Got %d training images.\n", nTrainFaces);
    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(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();
    
    // Save all the eigenvectors as images, so that they can be checked.
    if (SAVE_EIGENFACE_IMAGES) {
        storeEigenfaceImages();
    }
    
}
コード例 #7
0
ファイル: facerecog.c プロジェクト: atiti/OFR
void learn_eigenfaces() {
	int i, offset;
	nTrainFaces = loadFaceImgArray("train_eigen.txt");
	if (nTrainFaces < 2) {
		fprintf(stderr, "Need more than 2 faces to train\n");
		return;
	}

	doPCA();
	
	projectedTrainFaceMat = cvCreateMat(nTrainFaces, nEigens, CV_32FC1);
	offset = projectedTrainFaceMat->step / sizeof(float);
	for(i=0;i<nTrainFaces;i++) {
		cvEigenDecomposite(faceImgArr[i], nEigens, eigenVectArr, 0, 0,
				   pAvgTrainImg, projectedTrainFaceMat->data.fl + i*nEigens);

	}
	storeTrainingData_eigenfaces();
}
コード例 #8
0
void learn()
{
    int i, offset;
    numberOfTrainingFaces = loadfaceImageArray("/etc/pam_face_authentication/facemanager/face.key");
    doPCA();
    projectedTrainFaceMat = cvCreateMat( numberOfTrainingFaces, numberOfEigenVectors, CV_32FC1 );
    offset = projectedTrainFaceMat->step / sizeof(float);
    for (i=0; i<numberOfTrainingFaces; i++)
    {
        //int offset = i * numberOfEigenVectors;
        cvEigenDecomposite(
            faceImageArray[i],
            numberOfEigenVectors,
            eigenVectorArray,
            0, 0,
            averageTrainingImage,
            //projectedTrainFaceMat->data.fl + i*numberOfEigenVectors);
            projectedTrainFaceMat->data.fl + i*offset);
    }

    storeTrainingData();
}
コード例 #9
0
ファイル: MTT.cpp プロジェクト: gnishida/Morph
void MTT::findBoundaryVertices(RoadGraph* roads, RoadVertexDesc &v1_desc, RoadVertexDesc &v2_desc) {
	PCA pca;
	doPCA(roads, pca);

	QVector2D evector;
	evector.setX(pca.evectors.at<double>(0, 0));
	evector.setY(pca.evectors.at<double>(1, 0));

	float min_score = std::numeric_limits<float>::max();
	float max_score = -std::numeric_limits<float>::max();
	int min_pt_id, max_pt_id;
	for (int i = 0; i < pca.score.rows; i++) {
		float score = pca.score.at<double>(i, 0);
		if (score < min_score) {
			min_score = score;
			min_pt_id = i;
		}
		if (score > max_score) {
			max_score = score;
			max_pt_id = i;
		}
	}

	int count = 0;
	RoadVertexIter vi, vend;
	for (boost::tie(vi, vend) = boost::vertices(roads->graph); vi != vend; ++vi) {
		if (!roads->graph[*vi]->valid) continue;

		if (count == min_pt_id) {
			v1_desc = *vi;
		}
		if (count == max_pt_id) {
			v2_desc = * vi;
		}

		count++;
	}
}
コード例 #10
0
ファイル: fuction.cpp プロジェクト: xingren/face-recognition
//学习阶段代码
void learn()
{
	int i, offset;

	//加载训练图像集
	nTrainFaces = loadFaceImgArray("train.txt");
	if( nTrainFaces < 2 )
	{
		fprintf(stderr,
			"Need 2 or more training faces\n"
			"Input file contains only %d\n", nTrainFaces);
		return;
	}

	// 进行主成分分析
	doPCA();

	//将训练图集投影到子空间中
	projectedTrainFaceMat = cvCreateMat( nTrainFaces, nEigens, CV_32FC1 );
	offset = projectedTrainFaceMat->step / sizeof(float);
	for(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);
	}

	//将训练阶段得到的特征值,投影矩阵等数据存为.xml文件,以备测试时使用
	storeTrainingData();
}