qq_23933427 2015-03-02 09:31 采纳率: 0%
浏览 1711
已结题

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


#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 vector\n");
    }

    //对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;
}

这个代码是根据测试集与训练集投影向量之间的距离做排序,挑距离最小的作为匹配项。既然是找最小值,那么min的初始值默认为第一组距离。再增加个判断条件,就是当找到的最小值,仍大于某个阈值时,打印匹配失败。

  • 写回答

1条回答 默认 最新

  • Heart09 2015-04-07 11:59
    关注

    不明白你的问题在哪里,你自己都说了最后判断一下得到的最小值min。
    如果min大于SOMETHRESHOLD打印match failed,否则打印 label+1.jpg is matching,
    在最后计算完的时候,再判断一下不就行了吗?

    评论

报告相同问题?

悬赏问题

  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算