opencv pca-求大神指导,这段代码怎么添加判断条件。就是不满足这个条件的输出另外的结果

问题描述

求大神指导,这段代码怎么添加判断条件。就是不满足这个条件的输出另外的结果

double min = Euc_dist[0];
int label;
for (i=0;i
{
if (min>=Euc_dist[i])
{
min = Euc_dist[i];
label = i;
}}

printf("%d.jpg is mathcing!",label+1);

解决方案

直接把代码贴在这里,说清楚需求就可以了。

解决方案二:

double min = Euc_dist[0];
int label = -1;
for (i=0;i
{
if (min>=Euc_dist[i])
{
min = Euc_dist[i];
label = i;
}}
if (label == -1)
printf("nothing matched");
else
printf("%d.jpg is matching!",label+1);

解决方案三:

点这里编辑框上第六个图标,把代码放在里面,以免丢失字符。

解决方案四:

// face_recognition.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Process.h"
#include "My_Matrix.h"

int _tmain(int argc, _TCHAR* argv[])
{
double *T,*L,*m,*b,*q,*c,*p_q,*projected_train,*T_test,*projected_test,*eigenvector,*Euc_dist;
double eps,temp;
int i,j,flag,iteration,num_q;
char res[20];
IplImage *tmp_img,*test_img;

T = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH*TRAIN_NUM);    //原始数据
T_test = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH*1);       //测试数据
m = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH);      //平均值
L = (double *)malloc(sizeof(double)*TRAIN_NUM*TRAIN_NUM);       //L=T'*T,协方差矩阵
b = (double *)malloc(sizeof(double)*TRAIN_NUM);             //L的特征值
q = (double *)malloc(sizeof(double)*TRAIN_NUM*TRAIN_NUM);   //L特征值对应的特征向量
c = (double *)malloc(sizeof(double)*TRAIN_NUM);             //实对称三对角矩阵的次对角线元素

eps = 0.000001;
memset(L,0,sizeof(double)*TRAIN_NUM*TRAIN_NUM);

//存储图像数据到T矩阵
for (i=1;i<=TRAIN_NUM;i++)
{
    sprintf(res,".\TrainDatabase\%d.jpg",i);
    tmp_img = cvLoadImage(res,CV_LOAD_IMAGE_GRAYSCALE);
    load_data(T,tmp_img,i);
}

//求T矩阵行的平均值
calc_mean(T,m);

//构造协方差矩阵
calc_covariance_matrix(T,L,m);

//求L的特征值,特征向量
iteration = 60;
cstrq(L,TRAIN_NUM,q,b,c);
flag = csstq(TRAIN_NUM,b,c,q,eps,iteration); //数组q中第j列为数组b中第j个特征值对应的特征向量
if (flag<0)
{
    printf("fucking failed!n");
}else
{
    printf("success to get eigen value and vectorn");
}

//对L挑选合适的特征值,过滤特征向量
num_q=0;
for (i=0;i<TRAIN_NUM;i++)
{
    if (b[i]>1)
    {
        num_q++;
    }
}
p_q = (double *)malloc(sizeof(double)*TRAIN_NUM*TRAIN_NUM);         //挑选后的L的特征向量,仅过滤,未排序
projected_train = (double *)malloc(sizeof(double)*TRAIN_NUM*num_q); //投影后的训练样本特征空间
eigenvector = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH*num_q);//Pe=λe,Q(Xe)=λ(Xe),投影变换向量
pick_eignevalue(b,q,p_q,num_q);
get_eigenface(p_q,T,num_q,projected_train,eigenvector);

//读取测试图像
test_img = cvLoadImage(".\TestDatabase\4.jpg",CV_LOAD_IMAGE_GRAYSCALE);
projected_test = (double *)malloc(sizeof(double)*num_q*1);//在特征空间投影后的测试样本
for (i=0;i<IMG_HEIGHT;i++)
{
    for (j=0;j<IMG_WIDTH;j++)
    {
        T_test[i*IMG_WIDTH+j] = (double)(unsigned char)test_img->imageData[i*IMG_WIDTH+j] - m[i*IMG_WIDTH+j];
    }
}

//将待测数据投影到特征空间
memset(projected_test,0,sizeof(double)*num_q);
matrix_mutil(projected_test,eigenvector,T_test,num_q,IMG_WIDTH*IMG_HEIGHT,1);

//计算projected_test与projected_train中每个向量的欧氏距离
Euc_dist = (double *)malloc(sizeof(double)*TRAIN_NUM);
for (i=0;i<TRAIN_NUM;i++)
{
    temp = 0;
    for (j=0;j<num_q;j++)
    {
        temp = temp + (projected_test[j]-projected_train[j*TRAIN_NUM+i])*(projected_test[j]-projected_train[j*TRAIN_NUM+i]);
    }
    Euc_dist[i] = temp;
    //printf("%f n",temp);
}
//寻找最小距离
double min = Euc_dist[0];
int label;
for (i=0;i<TRAIN_NUM;i++)
{
    if (min>=Euc_dist[i])
    {
        min = Euc_dist[i];
        label = i;
    }
}
printf("%d.jpg is mathcing!",label+1);
return 0;

}


解决方案五:

// face_recognition.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Process.h"
#include "My_Matrix.h"

int _tmain(int argc, _TCHAR* argv[])
{
double *T,*L,*m,*b,*q,*c,*p_q,*projected_train,*T_test,*projected_test,*eigenvector,*Euc_dist;
double eps,temp;
int i,j,flag,iteration,num_q;
char res[20];
IplImage *tmp_img,*test_img;

T = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH*TRAIN_NUM);    //原始数据
T_test = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH*1);       //测试数据
m = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH);      //平均值
L = (double *)malloc(sizeof(double)*TRAIN_NUM*TRAIN_NUM);       //L=T'*T,协方差矩阵
b = (double *)malloc(sizeof(double)*TRAIN_NUM);             //L的特征值
q = (double *)malloc(sizeof(double)*TRAIN_NUM*TRAIN_NUM);   //L特征值对应的特征向量
c = (double *)malloc(sizeof(double)*TRAIN_NUM);             //实对称三对角矩阵的次对角线元素

eps = 0.000001;
memset(L,0,sizeof(double)*TRAIN_NUM*TRAIN_NUM);

//存储图像数据到T矩阵
for (i=1;i<=TRAIN_NUM;i++)
{
    sprintf(res,".\TrainDatabase\%d.jpg",i);
    tmp_img = cvLoadImage(res,CV_LOAD_IMAGE_GRAYSCALE);
    load_data(T,tmp_img,i);
}

//求T矩阵行的平均值
calc_mean(T,m);

//构造协方差矩阵
calc_covariance_matrix(T,L,m);

//求L的特征值,特征向量
iteration = 60;
cstrq(L,TRAIN_NUM,q,b,c);
flag = csstq(TRAIN_NUM,b,c,q,eps,iteration); //数组q中第j列为数组b中第j个特征值对应的特征向量
if (flag<0)
{
    printf("fucking failed!n");
}else
{
    printf("success to get eigen value and vectorn");
}

//对L挑选合适的特征值,过滤特征向量
num_q=0;
for (i=0;i<TRAIN_NUM;i++)
{
    if (b[i]>1)
    {
        num_q++;
    }
}
p_q = (double *)malloc(sizeof(double)*TRAIN_NUM*TRAIN_NUM);         //挑选后的L的特征向量,仅过滤,未排序
projected_train = (double *)malloc(sizeof(double)*TRAIN_NUM*num_q); //投影后的训练样本特征空间
eigenvector = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH*num_q);//Pe=λe,Q(Xe)=λ(Xe),投影变换向量
pick_eignevalue(b,q,p_q,num_q);
get_eigenface(p_q,T,num_q,projected_train,eigenvector);

//读取测试图像
test_img = cvLoadImage(".\TestDatabase\4.jpg",CV_LOAD_IMAGE_GRAYSCALE);
projected_test = (double *)malloc(sizeof(double)*num_q*1);//在特征空间投影后的测试样本
for (i=0;i<IMG_HEIGHT;i++)
{
    for (j=0;j<IMG_WIDTH;j++)
    {
        T_test[i*IMG_WIDTH+j] = (double)(unsigned char)test_img->imageData[i*IMG_WIDTH+j] - m[i*IMG_WIDTH+j];
    }
}

//将待测数据投影到特征空间
memset(projected_test,0,sizeof(double)*num_q);
matrix_mutil(projected_test,eigenvector,T_test,num_q,IMG_WIDTH*IMG_HEIGHT,1);

//计算projected_test与projected_train中每个向量的欧氏距离
Euc_dist = (double *)malloc(sizeof(double)*TRAIN_NUM);
for (i=0;i<TRAIN_NUM;i++)
{
    temp = 0;
    for (j=0;j<num_q;j++)
    {
        temp = temp + (projected_test[j]-projected_train[j*TRAIN_NUM+i])*(projected_test[j]-projected_train[j*TRAIN_NUM+i]);
    }
    Euc_dist[i] = temp;
    //printf("%f n",temp);
}
//寻找最小距离
double min = Euc_dist[0];
int label;
for (i=0;i<TRAIN_NUM;i++)
{
    if (min>=Euc_dist[i])
    {
        min = Euc_dist[i];
        label = i;
    }
}
printf("%d.jpg is mathcing!",label+1);
return 0;

}


解决方案六:

// face_recognition.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Process.h"
#include "My_Matrix.h"

int _tmain(int argc, _TCHAR* argv[])
{
double *T,*L,*m,*b,*q,*c,*p_q,*projected_train,*T_test,*projected_test,*eigenvector,*Euc_dist;
double eps,temp;
int i,j,flag,iteration,num_q;
char res[20];
IplImage *tmp_img,*test_img;

T = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH*TRAIN_NUM);    //原始数据
T_test = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH*1);       //测试数据
m = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH);      //平均值
L = (double *)malloc(sizeof(double)*TRAIN_NUM*TRAIN_NUM);       //L=T'*T,协方差矩阵
b = (double *)malloc(sizeof(double)*TRAIN_NUM);             //L的特征值
q = (double *)malloc(sizeof(double)*TRAIN_NUM*TRAIN_NUM);   //L特征值对应的特征向量
c = (double *)malloc(sizeof(double)*TRAIN_NUM);             //实对称三对角矩阵的次对角线元素

eps = 0.000001;
memset(L,0,sizeof(double)*TRAIN_NUM*TRAIN_NUM);

//存储图像数据到T矩阵
for (i=1;i<=TRAIN_NUM;i++)
{
    sprintf(res,".\TrainDatabase\%d.jpg",i);
    tmp_img = cvLoadImage(res,CV_LOAD_IMAGE_GRAYSCALE);
    load_data(T,tmp_img,i);
}

//求T矩阵行的平均值
calc_mean(T,m);

//构造协方差矩阵
calc_covariance_matrix(T,L,m);

//求L的特征值,特征向量
iteration = 60;
cstrq(L,TRAIN_NUM,q,b,c);
flag = csstq(TRAIN_NUM,b,c,q,eps,iteration); //数组q中第j列为数组b中第j个特征值对应的特征向量
if (flag<0)
{
    printf("fucking failed!n");
}else
{
    printf("success to get eigen value and vectorn");
}

//对L挑选合适的特征值,过滤特征向量
num_q=0;
for (i=0;i<TRAIN_NUM;i++)
{
    if (b[i]>1)
    {
        num_q++;
    }
}
p_q = (double *)malloc(sizeof(double)*TRAIN_NUM*TRAIN_NUM);         //挑选后的L的特征向量,仅过滤,未排序
projected_train = (double *)malloc(sizeof(double)*TRAIN_NUM*num_q); //投影后的训练样本特征空间
eigenvector = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH*num_q);//Pe=λe,Q(Xe)=λ(Xe),投影变换向量
pick_eignevalue(b,q,p_q,num_q);
get_eigenface(p_q,T,num_q,projected_train,eigenvector);

//读取测试图像
test_img = cvLoadImage(".\TestDatabase\4.jpg",CV_LOAD_IMAGE_GRAYSCALE);
projected_test = (double *)malloc(sizeof(double)*num_q*1);//在特征空间投影后的测试样本
for (i=0;i<IMG_HEIGHT;i++)
{
    for (j=0;j<IMG_WIDTH;j++)
    {
        T_test[i*IMG_WIDTH+j] = (double)(unsigned char)test_img->imageData[i*IMG_WIDTH+j] - m[i*IMG_WIDTH+j];
    }
}

//将待测数据投影到特征空间
memset(projected_test,0,sizeof(double)*num_q);
matrix_mutil(projected_test,eigenvector,T_test,num_q,IMG_WIDTH*IMG_HEIGHT,1);

//计算projected_test与projected_train中每个向量的欧氏距离
Euc_dist = (double *)malloc(sizeof(double)*TRAIN_NUM);
for (i=0;i<TRAIN_NUM;i++)
{
    temp = 0;
    for (j=0;j<num_q;j++)
    {
        temp = temp + (projected_test[j]-projected_train[j*TRAIN_NUM+i])*(projected_test[j]-projected_train[j*TRAIN_NUM+i]);
    }
    Euc_dist[i] = temp;
    //printf("%f n",temp);
}
//寻找最小距离
double min = Euc_dist[0];
int label;
for (i=0;i<TRAIN_NUM;i++)
{
    if (min>=Euc_dist[i])
    {
        min = Euc_dist[i];
        label = i;
    }
}
printf("%d.jpg is mathcing!",label+1);
return 0;

}


解决方案七:

// face_recognition.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Process.h"
#include "My_Matrix.h"

int _tmain(int argc, _TCHAR* argv[])
{
double *T,*L,*m,*b,*q,*c,*p_q,*projected_train,*T_test,*projected_test,*eigenvector,*Euc_dist;
double eps,temp;
int i,j,flag,iteration,num_q;
char res[20];
IplImage *tmp_img,*test_img;

T = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH*TRAIN_NUM);    //原始数据
T_test = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH*1);       //测试数据
m = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH);      //平均值
L = (double *)malloc(sizeof(double)*TRAIN_NUM*TRAIN_NUM);       //L=T'*T,协方差矩阵
b = (double *)malloc(sizeof(double)*TRAIN_NUM);             //L的特征值
q = (double *)malloc(sizeof(double)*TRAIN_NUM*TRAIN_NUM);   //L特征值对应的特征向量
c = (double *)malloc(sizeof(double)*TRAIN_NUM);             //实对称三对角矩阵的次对角线元素

eps = 0.000001;
memset(L,0,sizeof(double)*TRAIN_NUM*TRAIN_NUM);

//存储图像数据到T矩阵
for (i=1;i<=TRAIN_NUM;i++)
{
    sprintf(res,".\TrainDatabase\%d.jpg",i);
    tmp_img = cvLoadImage(res,CV_LOAD_IMAGE_GRAYSCALE);
    load_data(T,tmp_img,i);
}

//求T矩阵行的平均值
calc_mean(T,m);

//构造协方差矩阵
calc_covariance_matrix(T,L,m);

//求L的特征值,特征向量
iteration = 60;
cstrq(L,TRAIN_NUM,q,b,c);
flag = csstq(TRAIN_NUM,b,c,q,eps,iteration); //数组q中第j列为数组b中第j个特征值对应的特征向量
if (flag<0)
{
    printf("fucking failed!n");
}else
{
    printf("success to get eigen value and vectorn");
}

//对L挑选合适的特征值,过滤特征向量
num_q=0;
for (i=0;i<TRAIN_NUM;i++)
{
    if (b[i]>1)
    {
        num_q++;
    }
}
p_q = (double *)malloc(sizeof(double)*TRAIN_NUM*TRAIN_NUM);         //挑选后的L的特征向量,仅过滤,未排序
projected_train = (double *)malloc(sizeof(double)*TRAIN_NUM*num_q); //投影后的训练样本特征空间
eigenvector = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH*num_q);//Pe=λe,Q(Xe)=λ(Xe),投影变换向量
pick_eignevalue(b,q,p_q,num_q);
get_eigenface(p_q,T,num_q,projected_train,eigenvector);

//读取测试图像
test_img = cvLoadImage(".\TestDatabase\4.jpg",CV_LOAD_IMAGE_GRAYSCALE);
projected_test = (double *)malloc(sizeof(double)*num_q*1);//在特征空间投影后的测试样本
for (i=0;i<IMG_HEIGHT;i++)
{
    for (j=0;j<IMG_WIDTH;j++)
    {
        T_test[i*IMG_WIDTH+j] = (double)(unsigned char)test_img->imageData[i*IMG_WIDTH+j] - m[i*IMG_WIDTH+j];
    }
}

//将待测数据投影到特征空间
memset(projected_test,0,sizeof(double)*num_q);
matrix_mutil(projected_test,eigenvector,T_test,num_q,IMG_WIDTH*IMG_HEIGHT,1);

//计算projected_test与projected_train中每个向量的欧氏距离
Euc_dist = (double *)malloc(sizeof(double)*TRAIN_NUM);
for (i=0;i<TRAIN_NUM;i++)
{
    temp = 0;
    for (j=0;j<num_q;j++)
    {
        temp = temp + (projected_test[j]-projected_train[j*TRAIN_NUM+i])*(projected_test[j]-projected_train[j*TRAIN_NUM+i]);
    }
    Euc_dist[i] = temp;
    //printf("%f n",temp);
}
//寻找最小距离
double min = Euc_dist[0];
int label;
for (i=0;i<TRAIN_NUM;i++)
{
    if (min>=Euc_dist[i])
    {
        min = Euc_dist[i];
        label = i;
    }
}
printf("%d.jpg is mathcing!",label+1);
return 0;

}


解决方案八:

// face_recognition.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Process.h"
#include "My_Matrix.h"

int _tmain(int argc, _TCHAR* argv[])
{
double *T,*L,*m,*b,*q,*c,*p_q,*projected_train,*T_test,*projected_test,*eigenvector,*Euc_dist;
double eps,temp;
int i,j,flag,iteration,num_q;
char res[20];
IplImage *tmp_img,*test_img;

T = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH*TRAIN_NUM);    //原始数据
T_test = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH*1);       //测试数据
m = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH);      //平均值
L = (double *)malloc(sizeof(double)*TRAIN_NUM*TRAIN_NUM);       //L=T'*T,协方差矩阵
b = (double *)malloc(sizeof(double)*TRAIN_NUM);             //L的特征值
q = (double *)malloc(sizeof(double)*TRAIN_NUM*TRAIN_NUM);   //L特征值对应的特征向量
c = (double *)malloc(sizeof(double)*TRAIN_NUM);             //实对称三对角矩阵的次对角线元素

eps = 0.000001;
memset(L,0,sizeof(double)*TRAIN_NUM*TRAIN_NUM);

//存储图像数据到T矩阵
for (i=1;i<=TRAIN_NUM;i++)
{
    sprintf(res,".\TrainDatabase\%d.jpg",i);
    tmp_img = cvLoadImage(res,CV_LOAD_IMAGE_GRAYSCALE);
    load_data(T,tmp_img,i);
}

//求T矩阵行的平均值
calc_mean(T,m);

//构造协方差矩阵
calc_covariance_matrix(T,L,m);

//求L的特征值,特征向量
iteration = 60;
cstrq(L,TRAIN_NUM,q,b,c);
flag = csstq(TRAIN_NUM,b,c,q,eps,iteration); //数组q中第j列为数组b中第j个特征值对应的特征向量
if (flag<0)
{
    printf("fucking failed!n");
}else
{
    printf("success to get eigen value and vectorn");
}

//对L挑选合适的特征值,过滤特征向量
num_q=0;
for (i=0;i<TRAIN_NUM;i++)
{
    if (b[i]>1)
    {
        num_q++;
    }
}
p_q = (double *)malloc(sizeof(double)*TRAIN_NUM*TRAIN_NUM);         //挑选后的L的特征向量,仅过滤,未排序
projected_train = (double *)malloc(sizeof(double)*TRAIN_NUM*num_q); //投影后的训练样本特征空间
eigenvector = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH*num_q);//Pe=λe,Q(Xe)=λ(Xe),投影变换向量
pick_eignevalue(b,q,p_q,num_q);
get_eigenface(p_q,T,num_q,projected_train,eigenvector);

//读取测试图像
test_img = cvLoadImage(".\TestDatabase\4.jpg",CV_LOAD_IMAGE_GRAYSCALE);
projected_test = (double *)malloc(sizeof(double)*num_q*1);//在特征空间投影后的测试样本
for (i=0;i<IMG_HEIGHT;i++)
{
    for (j=0;j<IMG_WIDTH;j++)
    {
        T_test[i*IMG_WIDTH+j] = (double)(unsigned char)test_img->imageData[i*IMG_WIDTH+j] - m[i*IMG_WIDTH+j];
    }
}

//将待测数据投影到特征空间
memset(projected_test,0,sizeof(double)*num_q);
matrix_mutil(projected_test,eigenvector,T_test,num_q,IMG_WIDTH*IMG_HEIGHT,1);

//计算projected_test与projected_train中每个向量的欧氏距离
Euc_dist = (double *)malloc(sizeof(double)*TRAIN_NUM);
for (i=0;i<TRAIN_NUM;i++)
{
    temp = 0;
    for (j=0;j<num_q;j++)
    {
        temp = temp + (projected_test[j]-projected_train[j*TRAIN_NUM+i])*(projected_test[j]-projected_train[j*TRAIN_NUM+i]);
    }
    Euc_dist[i] = temp;
    //printf("%f n",temp);
}
//寻找最小距离
double min = Euc_dist[0];
int label;
for (i=0;i<TRAIN_NUM;i++)
{
    if (min>=Euc_dist[i])
    {
        min = Euc_dist[i];
        label = i;
    }
}
printf("%d.jpg is mathcing!",label+1);
return 0;

}


解决方案九:

// face_recognition.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Process.h"
#include "My_Matrix.h"

int _tmain(int argc, _TCHAR* argv[])
{
double *T,*L,*m,*b,*q,*c,*p_q,*projected_train,*T_test,*projected_test,*eigenvector,*Euc_dist;
double eps,temp;
int i,j,flag,iteration,num_q;
char res[20];
IplImage *tmp_img,*test_img;

T = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH*TRAIN_NUM);    //原始数据
T_test = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH*1);       //测试数据
m = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH);      //平均值
L = (double *)malloc(sizeof(double)*TRAIN_NUM*TRAIN_NUM);       //L=T'*T,协方差矩阵
b = (double *)malloc(sizeof(double)*TRAIN_NUM);             //L的特征值
q = (double *)malloc(sizeof(double)*TRAIN_NUM*TRAIN_NUM);   //L特征值对应的特征向量
c = (double *)malloc(sizeof(double)*TRAIN_NUM);             //实对称三对角矩阵的次对角线元素

eps = 0.000001;
memset(L,0,sizeof(double)*TRAIN_NUM*TRAIN_NUM);

//存储图像数据到T矩阵
for (i=1;i<=TRAIN_NUM;i++)
{
    sprintf(res,".\TrainDatabase\%d.jpg",i);
    tmp_img = cvLoadImage(res,CV_LOAD_IMAGE_GRAYSCALE);
    load_data(T,tmp_img,i);
}

//求T矩阵行的平均值
calc_mean(T,m);

//构造协方差矩阵
calc_covariance_matrix(T,L,m);

//求L的特征值,特征向量
iteration = 60;
cstrq(L,TRAIN_NUM,q,b,c);
flag = csstq(TRAIN_NUM,b,c,q,eps,iteration); //数组q中第j列为数组b中第j个特征值对应的特征向量
if (flag<0)
{
    printf("fucking failed!n");
}else
{
    printf("success to get eigen value and vectorn");
}

//对L挑选合适的特征值,过滤特征向量
num_q=0;
for (i=0;i<TRAIN_NUM;i++)
{
    if (b[i]>1)
    {
        num_q++;
    }
}
p_q = (double *)malloc(sizeof(double)*TRAIN_NUM*TRAIN_NUM);         //挑选后的L的特征向量,仅过滤,未排序
projected_train = (double *)malloc(sizeof(double)*TRAIN_NUM*num_q); //投影后的训练样本特征空间
eigenvector = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH*num_q);//Pe=λe,Q(Xe)=λ(Xe),投影变换向量
pick_eignevalue(b,q,p_q,num_q);
get_eigenface(p_q,T,num_q,projected_train,eigenvector);

//读取测试图像
test_img = cvLoadImage(".\TestDatabase\4.jpg",CV_LOAD_IMAGE_GRAYSCALE);
projected_test = (double *)malloc(sizeof(double)*num_q*1);//在特征空间投影后的测试样本
for (i=0;i<IMG_HEIGHT;i++)
{
    for (j=0;j<IMG_WIDTH;j++)
    {
        T_test[i*IMG_WIDTH+j] = (double)(unsigned char)test_img->imageData[i*IMG_WIDTH+j] - m[i*IMG_WIDTH+j];
    }
}

//将待测数据投影到特征空间
memset(projected_test,0,sizeof(double)*num_q);
matrix_mutil(projected_test,eigenvector,T_test,num_q,IMG_WIDTH*IMG_HEIGHT,1);

//计算projected_test与projected_train中每个向量的欧氏距离
Euc_dist = (double *)malloc(sizeof(double)*TRAIN_NUM);
for (i=0;i<TRAIN_NUM;i++)
{
    temp = 0;
    for (j=0;j<num_q;j++)
    {
        temp = temp + (projected_test[j]-projected_train[j*TRAIN_NUM+i])*(projected_test[j]-projected_train[j*TRAIN_NUM+i]);
    }
    Euc_dist[i] = temp;
    //printf("%f n",temp);
}
//寻找最小距离
double min = Euc_dist[0];
int label;
for (i=0;i<TRAIN_NUM;i++)
{
    if (min>=Euc_dist[i])
    {
        min = Euc_dist[i];
        label = i;
    }
}
printf("%d.jpg is mathcing!",label+1);
return 0;

}


解决方案十:

// face_recognition.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Process.h"
#include "My_Matrix.h"

int _tmain(int argc, _TCHAR* argv[])
{
double *T,*L,*m,*b,*q,*c,*p_q,*projected_train,*T_test,*projected_test,*eigenvector,*Euc_dist;
double eps,temp;
int i,j,flag,iteration,num_q;
char res[20];
IplImage *tmp_img,*test_img;

T = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH*TRAIN_NUM);    //原始数据
T_test = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH*1);       //测试数据
m = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH);      //平均值
L = (double *)malloc(sizeof(double)*TRAIN_NUM*TRAIN_NUM);       //L=T'*T,协方差矩阵
b = (double *)malloc(sizeof(double)*TRAIN_NUM);             //L的特征值
q = (double *)malloc(sizeof(double)*TRAIN_NUM*TRAIN_NUM);   //L特征值对应的特征向量
c = (double *)malloc(sizeof(double)*TRAIN_NUM);             //实对称三对角矩阵的次对角线元素

eps = 0.000001;
memset(L,0,sizeof(double)*TRAIN_NUM*TRAIN_NUM);

//存储图像数据到T矩阵
for (i=1;i<=TRAIN_NUM;i++)
{
    sprintf(res,".\TrainDatabase\%d.jpg",i);
    tmp_img = cvLoadImage(res,CV_LOAD_IMAGE_GRAYSCALE);
    load_data(T,tmp_img,i);
}

//求T矩阵行的平均值
calc_mean(T,m);

//构造协方差矩阵
calc_covariance_matrix(T,L,m);

//求L的特征值,特征向量
iteration = 60;
cstrq(L,TRAIN_NUM,q,b,c);
flag = csstq(TRAIN_NUM,b,c,q,eps,iteration); //数组q中第j列为数组b中第j个特征值对应的特征向量
if (flag<0)
{
    printf("fucking failed!n");
}else
{
    printf("success to get eigen value and vectorn");
}

//对L挑选合适的特征值,过滤特征向量
num_q=0;
for (i=0;i<TRAIN_NUM;i++)
{
    if (b[i]>1)
    {
        num_q++;
    }
}
p_q = (double *)malloc(sizeof(double)*TRAIN_NUM*TRAIN_NUM);         //挑选后的L的特征向量,仅过滤,未排序
projected_train = (double *)malloc(sizeof(double)*TRAIN_NUM*num_q); //投影后的训练样本特征空间
eigenvector = (double *)malloc(sizeof(double)*IMG_HEIGHT*IMG_WIDTH*num_q);//Pe=λe,Q(Xe)=λ(Xe),投影变换向量
pick_eignevalue(b,q,p_q,num_q);
get_eigenface(p_q,T,num_q,projected_train,eigenvector);

//读取测试图像
test_img = cvLoadImage(".\TestDatabase\4.jpg",CV_LOAD_IMAGE_GRAYSCALE);
projected_test = (double *)malloc(sizeof(double)*num_q*1);//在特征空间投影后的测试样本
for (i=0;i<IMG_HEIGHT;i++)
{
    for (j=0;j<IMG_WIDTH;j++)
    {
        T_test[i*IMG_WIDTH+j] = (double)(unsigned char)test_img->imageData[i*IMG_WIDTH+j] - m[i*IMG_WIDTH+j];
    }
}

//将待测数据投影到特征空间
memset(projected_test,0,sizeof(double)*num_q);
matrix_mutil(projected_test,eigenvector,T_test,num_q,IMG_WIDTH*IMG_HEIGHT,1);

//计算projected_test与projected_train中每个向量的欧氏距离
Euc_dist = (double *)malloc(sizeof(double)*TRAIN_NUM);
for (i=0;i<TRAIN_NUM;i++)
{
    temp = 0;
    for (j=0;j<num_q;j++)
    {
        temp = temp + (projected_test[j]-projected_train[j*TRAIN_NUM+i])*(projected_test[j]-projected_train[j*TRAIN_NUM+i]);
    }
    Euc_dist[i] = temp;
    //printf("%f n",temp);
}
//寻找最小距离
double min = Euc_dist[0];
int label;
for (i=0;i<TRAIN_NUM;i++)
{
    if (min>=Euc_dist[i])
    {
        min = Euc_dist[i];
        label = i;
    }
}
printf("%d.jpg is mathcing!",label+1);
return 0;

}


时间: 2024-08-03 14:35:44

opencv pca-求大神指导,这段代码怎么添加判断条件。就是不满足这个条件的输出另外的结果的相关文章

求大神指导一段代码的单元测试如何写

问题描述 Pathdst_path=newPath(photoPath);try{FileSystemhdfs=dst_path.getFileSystem(conf);if(hdfs.exists(dst_path)){hdfs.delete(dst_path,true);}}catch(IOExceptione){LOG.error(e.getMessage(),e);}对HDFS上的文件进行删除,向这段代码进行mockito,不知道怎么下手,求哪位大神可以指导下

c++-C++ 求大神帮忙修改段代码,信息管理系统,把原有的类拆成四个派生类

问题描述 C++ 求大神帮忙修改段代码,信息管理系统,把原有的类拆成四个派生类 http://pan.baidu.com/s/1o69SUWq 这里面是头文件和源文件和说明 求大神帮帮忙 解决方案 链接不存在了 提供一个思路吧,也就把工作细分化.把功能具体化.举一个简单例子 假如有一个图书管理类. 你可以拆分为:借书类.还书类.查书类等,

c++-求大神解释这段代码,是什么意思!

问题描述 求大神解释这段代码,是什么意思! __field_bcount(cbData) PVOID lpData; 解决方案 这是一个宏, #define __field_bcount ( size ) __notnull __byte_writableTo(size) __field_bcount(cbData) PVOID lpData; //指向用户定义数据的指针} 解决方案二: 如果不看前半部分,PVOID lpData;是最简单的一个 VOID 型指针的定义语句.然后就是搞清楚 __

求大神把这段代码完成的功能用asp代码写出来

问题描述 求大神把这段代码完成的功能用asp代码写出来 protected void Button1_Click(object sender, System.EventArgs e) { XmlDocument doc = new XmlDocument(); String Account = TextBox1.Text.ToString(); String Password = TextBox2.Text.ToString(); String url = "http://3tong.net/h

求大神看看这段代码哪有问题

问题描述 这个代码是一个树形数据结构,有3个方法,add()添加一个节点,parent()查找该对象的父节点,和children()遍历节点的所有子节点,在add()方法中的if语句里我曾想使用和parent()方法里同样原理的.equals来比较传入的字符串.但是不知道出于什么原因,.equals在parent()方法里没有问题,但是如果用在add()方法里却会报空指针异常(见代码注释),然而使用==却能正常运行.我对==和.equals的理解是:==是比较对象在内存中是否存放在同一位置,而.

跳转-PHP后台注销登录以后点击”后退“按钮仍然能回去,求大神指导~~~感激不尽

问题描述 PHP后台注销登录以后点击"后退"按钮仍然能回去,求大神指导~~~感激不尽 我用的session判断,注销的时候销毁session,然后跳转到登录页面,可是点击后退的时候仍然能访问,求解答 解决方案 不会的. demo.php <?php session_start(); if(isset($_SESSION['login']) && $_SESSION['login']!=''){ echo 'ok'; echo '<a href="l

代码-做一个贴吧评价功能,求大神指导啊。

问题描述 做一个贴吧评价功能,求大神指导啊. 做一个贴吧评价功能,简单的评价功能,小弟不才,求大神指导,这个代码怎么敲!

vs2012+matlab2013-VS2012调用matlab2013出现问题。跪求大神指导啊

问题描述 VS2012调用matlab2013出现问题.跪求大神指导啊 函数代码: int main(int argc, char argv[]) { QApplication a(argc, argv); loSmoothing w; w.show(); Engine *ep; //定义matlab引擎指针 if (!(ep=engOpen(NULL))) //测试是否启动Matlab引擎成功. { cout <<"Can't start Matlab engine!"

java-求大神看看这段代码有什么错误 总是存不到指定的地方 求大神指教

问题描述 求大神看看这段代码有什么错误 总是存不到指定的地方 求大神指教 求大神看看这段代码有什么错误 总是存不到指定的地方 求大神指教 解决方案 你可以调试进去,看看localfile的值是不是你想要的值 解决方案二: - 检查ROOT目录有没有获取到正确值 - 检查目录路径生成的相关代码逻辑问题 解决方案三: 解决问题的方法:学会debug!

c++基础c++-求大神写一段c++代码,做题能做对但是自己写代码就漏洞百出,求大神指导

问题描述 求大神写一段c++代码,做题能做对但是自己写代码就漏洞百出,求大神指导 年龄 Age姓名 char name公有成员函数: 构造函数 带参数的构造函数Student(int mchar); 不带参数的构造函数 Student() 析构函数 -Student() 改变数据成员值函数 void SetMemer(int mchar *) 获取数据成员函数 int GetAge() char * GetName()要求:在main()中定义一个有3个元素的对象数组并分别初始化,然后输出对象数