基于OpenCV依次读取文件夹下的所有图像文件

来源:互联网 发布:java的mvc框架 编辑:程序博客网 时间:2024/05/23 01:11
//编程环境:VS2008+OpenCV1.1,
//本程序首先挨个读取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;}


0 0
原创粉丝点击