OpenCV中显示特征脸为黑色是什么原因
OpenCV中显示特征脸图片时是黑色是什么原因
特征脸矩阵数据如下(部分):
0.000672752 -0.00398728 -4.23263e-005 -0.0150063 -0.0100655 -0.00682615 -0.0136038 -0.00788624 -0.0116071 -0.0170394 -0.0113726 -0.00329139 -0.00835479 -0.00103875 -0.0142026 -0.0157444 -0.00300682 -0.00911777 -0.00928913 -0.0149414 -0.00239133 -0.00676903 0.00255839 -0.0260086 -0.0176653 -0.00379464 -0.0136513 -0.000317007 0.00736613 -0.0228252 -0.0057197 0.000358763 0.00238805 0.00498493 -0.027213 -0.00735805 0.00357394 0.00700721 -0.00336265 0.00625503 -0.0144903 -0.000144143 0.00967291 0.00113688 0.00268168 -0.0240363 0.00871699 0.000356486 -0.00095915 -0.000674725 0.0107582 -0.00599353 0.00250839 -0.00294682 -0.00241268 0.00397216 0.0161414 0.00467632 -0.00419795 -0.00875254 0.000507923 0.00745908 0.00289604 -0.00840111 0.0064205 0.0132191 0.00565852 0.0171387 0.00387539 0.00292129 0.00613545 -0.00697766 0.00481558 0.000702915 0.00950864 0.00292367 0.0133789 0.00308503 0.0134737 0.00894141 0.00250446 0.00646444 0.00190217 0.00691703 0.00347312 0.00927087 0.00509597 0.00993473 0.00664872 0.0139689 0.00986597 0.0112875 0.00626067 0.00739277 0.0123023 0.0026249 0.0155314 0.0201914 0.0097147 0.00645924 0.00216852 0.00438826 0.0105113
......
程序如下:
#include <stdio.h>#include <cv.h>#include <highgui.h>#include <iostream>using namespace std;void main(){ float Vector[10][92*112]; char fileName[40]; int img_num; int start; for(img_num=0;img_num<10;img_num++) //对每一张图片进行操作 { sprintf(fileName, "trainData\\%d.pgm", img_num+1); IplImage *img_src = cvLoadImage(fileName, CV_LOAD_IMAGE_GRAYSCALE); IplImage *img_gray = cvCreateImage(cvSize(92,112), 8, 1); cvResize(img_src, img_gray); CvMat *Mat_tmp = cvCreateMat(img_gray->height, img_gray->width, CV_32FC1); cvConvert(img_gray, Mat_tmp); //得到转换成100*100维图片后转换成矩阵; //将矩阵数据转换成一行向量,有10副图,Vector[*][100*100] *处为10; start = 0; for(int i=0;i<Mat_tmp->cols;i++) { for(int j=0;j<Mat_tmp->rows;j++) { float value = cvmGet(Mat_tmp, j, i); Vector[img_num][start] = value; start++; } } //内存释放; cvReleaseImage(&img_src); cvReleaseImage(&img_gray); cvReleaseMat(&Mat_tmp); } //初始化CalcPCA参数 CvMat data; cvInitMatHeader( &data, 10, 92*112, CV_32FC1, Vector); CvMat *pAvgVector = cvCreateMat( 1, 92*112, CV_32FC1); CvMat *pEigenValue = cvCreateMat( 1, 10, CV_32FC1); CvMat *pEigenVector = cvCreateMat( 10, 92*112, CV_32FC1); cvCalcPCA(&data, pAvgVector, pEigenValue, pEigenVector, CV_PCA_DATA_AS_ROW); //输出特征值; cout<<"特征值为:"<<endl; for(int i=0; i<10; i++) { printf("%f\n", cvmGet(pEigenValue, 0, i)); } //求出特征脸; CvMat *mat = cvCreateMat(92, 112, CV_32FC1); start = 0; for(i=0; i<112; i++) { for(int j=0; j<92; j++) { cvmSet(mat, j, i, cvmGet(pEigenVector, 0, start)); start++; } } //标准化特征脸里面的数据; cvNormalize(mat, mat, 255); //显示特征脸 cvNamedWindow("FeatureFace",1); cvShowImage("FeatureFace", mat); cvWaitKey(0); //释放内存空间; cvReleaseMat(&mat); cvReleaseMat(&pAvgVector); cvReleaseMat(&pEigenValue); cvReleaseMat(&pEigenVector); }