经过Gabor后的图像,经由这个程序进行DCT的降维处理并保存成arff文件--2012-12-20

来源:互联网 发布:tvb网络电视直播手机版 编辑:程序博客网 时间:2024/05/16 06:03
/*cv200d.libcvaux200d.libcxcore200d.libcxts200d.libhighgui200d.libml200d.lib*/#include <iostream>#include <vector>#include <cv.h>#include <highgui.h>#include <fstream>#include <string>using namespace std;//zigzag变换,只在把矩阵变成一个向量。void ZigZag(double *DCTMatrix,int width,int height,double *zigzagVector){int h = 1,v = 1;int vmin = 1,hmin = 1;int vmax = height, hmax = width;    //vertical, horizontalint i;memset(zigzagVector, 0, sizeof(float) * height * width );i=1;while(v<=vmax && h<=hmax){if((h+v)%2==0){if(v==vmin){zigzagVector[i-1]=*(DCTMatrix + width*(v-1) + h-1);if(h==hmax){v=v+1;}else{h=h+1;}i=i+1;}else if((h==hmax) && (v<vmax)){zigzagVector[i-1]=*(DCTMatrix + width*(v-1) + h-1);v=v+1;i=i+1;}else if((v>vmin) && (h<hmax)){zigzagVector[i-1]=*(DCTMatrix + width*(v-1) + h-1);v=v-1;h=h+1;i=i+1;}}else{if((v==vmax) && (h<=hmax)){zigzagVector[i-1]=*(DCTMatrix + width*(v-1) + h-1);h=h+1;i=i+1;}else if(h==hmin){zigzagVector[i-1]=*(DCTMatrix + width*(v-1) + h-1);if(v==vmax)h=h+1;elsev=v+1;i=i+1;}else if((v<vmax) && (h>hmin)){zigzagVector[i-1]=*(DCTMatrix + width*(v-1) + h-1);v=v+1;h=h-1;i=i+1;}}if((v==vmax) && (h==hmax)){zigzagVector[i-1]=*(DCTMatrix + width*(v-1) + h-1);break;}}}vector<double>  DCTtransform(IplImage* image){//CvMat* OldMat=cvCreateMat(image->height,image->width,CV_32FC1); //原矩阵cout << image->nChannels <<endl;IplImage *r = cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1);IplImage *g = cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1);IplImage *b = cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1);cvSplit(image,r,g,b,NULL);IplImage* s = cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1);cvAddWeighted(r,1./3.,g,1./3.,0.0,s);cvAddWeighted(s,2./3.,b,1./3.,0.0,s);CvMat* Mat=cvCreateMat(s->height,s->width,CV_64FC1);//因为特征信息是以列向量存储的,所以要将矩阵进行转置,这个矩阵为转置之后的矩阵CvMat* DCT=cvCreateMat(s->height,s->width,CV_64FC1);//DCT变换后的矩阵,用DCT变换要保证图像的高和宽都要为偶数 cvConvert(s, Mat);//将源图像内容赋值给矩阵(Mat)cvSacle//cvTranspose(image,Mat);//转置操作cvDCT(Mat,DCT, CV_DXT_FORWARD);//对矩阵进行DCT变化,结果在矩阵DCT中//将DCT变换的矩阵结果通过ZigZag算法,取其前100位,实现DCT降维unsigned int  width = DCT->cols;unsigned int  height =DCT->rows;double  * orig = new double[height*width];int i1 = 0;for( int y=0;y<DCT->rows;++y)//取矩阵值{for(int x=0;x<DCT->cols;++x){*(orig + i1) = cvmGet(DCT,y,x);i1++;}}double * zigzagVector = new double[width*height];memset(zigzagVector , 0 ,sizeof(float) * width*height);ZigZag(orig,width,height,zigzagVector);                         //ZigZag变换vector<double> vec;                                              //ZigZag之后的完整向量vector<double> vec1;                                             //截取前100位的向量for(unsigned int i = 0; i < height; ++i){for(unsigned int j = 0;j < width;++j){if(vec.size()<=200) {vec.push_back(*(zigzagVector + i * height +j));}elsevec.push_back(0);}}for(vector<double>::size_type i = 0; i <200; ++i){vec1.push_back(vec[i]);}cvReleaseMat(&DCT);                                             //释放内存空间cvReleaseMat(&Mat);delete orig;delete zigzagVector;return vec1;}void main(){char num[3];vector<vector<double>> AllVector;    vector<double> v; for(int i=1;i<=39;i++)//图片个数{itoa(i,num,10);string FileName=string("C:\\Users\\user\\Desktop\\mouth\\Gabor\\angry\\rename\\angry-")+num;//图片的存储路径和命名习惯FileName = FileName + string(".png");cout << FileName <<endl;IplImage *p =cvLoadImage((char *)FileName.c_str());v = DCTtransform(p);AllVector.push_back(v);}//输出到文件ofstream OutFile("C:\\Users\\user\\Desktop\\mouth\\Gabor\\angry\\rename\\mouth-angry-200.arff");//arff的保存路径if(!OutFile.is_open()){cout << "输出文件,未被打开。。。"<<endl;}    OutFile<<"@relation 'FER'"<<endl;      char *ch = new char;      for(int i=1;i<=200;i++)      {          itoa(i,ch,10);          OutFile<<"@attribute feature"+string(ch)+" real"<<endl;      }      OutFile << "@attribute 'class' {angry,disgust,fear,happy,sad,surprise}"<<endl;      OutFile << "@data" << endl;for(vector<vector<double>>::size_type i=0; i != AllVector.size(); ++i){for(vector<double>::size_type j=0; j != v.size(); ++j){OutFile << AllVector.at(i).at(j) << ",";}OutFile <<"angry" << endl;//arff文件中,每一条特征的标识位}OutFile.close();}


这是第二篇论文的程序。

以上程序,是将昨晚Gabor变换的图片,进行DCT变换,然后再用zigzag变换提取200维特征,然后格式化成arff文件,为weka提供数据。在进行分类识别。。

原创粉丝点击