基于OpenCV依次读取文件夹下的所有图像文件
//编程环境:VS2008+OpenCV1.1,
//本程序首先挨个读取F://my face database//OnlyFace文件夹下的所有图 像 文件,之后,在项目文件夹下
//建立一 个名为“result.xls”的Excel文件,对于每一 个图 像 文件,在RGB颜色空间进行归 一 化 处理,将每个
//像 素点的R,G,B分量的均值和方差输出到该excel文件中。该程序,可用于对大规模图 像 样本进行训练。
//本程序首先挨个读取F://my face database//OnlyFace文件夹下的所有图 像 文件,之后,在项目文件夹下
//建立一 个名为“result.xls”的Excel文件,对于每一 个图 像 文件,在RGB颜色空间进行归 一 化 处理,将每个
//像 素点的R,G,B分量的均值和方差输出到该excel文件中。该程序,可用于对大规模图 像 样本进行训练。
#include "stdafx.h" #include "afxwin.h" #include "cv.h" #include "highgui.h" #include "fstream" using namespace std ; int _tmain(int argc, _TCHAR* argv[]) { int height,width,step,channels ; int i,j,k; int n= 0 ; IplImage* img ; uchar* data ; uchar BlueValue ; uchar GreenValue ; uchar RedValue ; float sum ; CFileFind ImageFile ;//定义FindFile对象 CString FileName ;//定义图 像 文件的名称 CString ImageFileAddress ;//CString类型的图 像 文件路径 char *FileAddress = new char[38] ;//定义存储文件地址的数组 CvScalar Avg_r,Avg_g ;//红色和绿色的平均值 CvScalar Std_r,Std_g ; float RedAvg,GreenAvg,RedStd,GreenStd ; float* red = 0 ; float* green = 0 ; ofstream outobj("result.xls") ;//建立类ofstream的对象outobj,并将其与int.xls关联起来。使用“《”流插入运算符写数据到outobj outobj<<"RedAvg"<<" "<<"GreenAvg"<<" "<<"RedStd"<<" "<<"GreenStd"<<endl ; bool FileExist = ImageFile.FindFile(_T("F://my face database//OnlyFace//*.jpg"),0) ;//查找所有文件,返回非0表示执行成功 while(FileExist) { FileExist = ImageFile.FindNextFileW() ;//如果文件存在,继续寻找下一 个符合条件的文件 if(!ImageFile.IsDots())//0表示文件属性不是“。”和“。。” { FileName = ImageFile.GetFileName() ;//获取图 像 文件名称 ImageFileAddress = "F:/my face database/OnlyFace/" + FileName;//得到图 像 文件路径 for(int i=0;i<37;i++) { FileAddress[i] = ImageFileAddress[i] ;//应Open CV函数调用的需要,将图 像 文件路径CString格式转换为char*格式 } FileAddress[37] = '/0' ;//因为char型数组FileAddress存储的是字符串,此处的字符串终止符是必须的 img = cvLoadImage(FileAddress) ;//读取图 像 文件 if(!img) printf("load image file failed!") ;//当打开文件失败时,提示 height = img->height ; width = img->width ; step = img->widthStep ; channels = img->nChannels ; data = (uchar*)img->imageData ; red = new float[height*width] ; green = new float[height*width] ; for(i=0;i<height;i++) { for(j=0;j<width;j++) { for(k=0;k<channels;k++) { switch(k) { case 0://获取蓝色B分量 { BlueValue = data[i*step+j*channels+k]; break ; } case 1://提取绿色G分量 { GreenValue = data[i*step+j*channels+k] ; break ; } case 2://提取红色R分量 { RedValue = data[i*step+j*channels+k] ; break ; } } } sum = (float)(RedValue + GreenValue + BlueValue) ; if(n<height*width) { red[n] = (float)RedValue/sum ;//归 一 化 处理 green[n] = (float)GreenValue/sum ; n++ ; } } } CvMat* MatrixRed = cvCreateMat(1,height*width,CV_32FC1) ;//创建矩阵 CvMat* MatrixGreen = cvCreateMat(1,height*width,CV_32FC1) ; cvSetData(MatrixRed,red,MatrixRed->step) ;//设置数组头 cvSetData(MatrixGreen,green,MatrixGreen->step) ; cvAvgSdv(MatrixRed,&Avg_r,&Std_r) ;//计算红色分量的均值和标准差 cvAvgSdv(MatrixGreen,&Avg_g,&Std_g) ; RedAvg = Avg_r.val[0] ; GreenAvg = Avg_g.val[0] ; RedStd = Std_r.val[0] * Std_r.val[0] ; GreenStd = Std_g.val[0] * Std_g.val[0] ; outobj<<RedAvg<<" "<<GreenAvg<<" "<<RedStd<<" "<<GreenStd<<endl ; delete [] red ; delete [] green ; red = 0 ; green = 0 ; cvReleaseMat(&MatrixRed) ; cvReleaseMat(&MatrixGreen) ; cvNamedWindow("Image",CV_WINDOW_AUTOSIZE) ;//创建窗口 cvShowImage("Image",img) ;//显示图 像 cvWaitKey(10) ; cvDestroyWindow("Image") ;//销毁窗口 cvReleaseImage(&img) ;//销毁图 像 n = 0 ; } } while(1) ; delete [] FileAddress ; return 0; }