攻城狮凌风

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

//编程环境: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;
}


posted on 2014-08-21 21:26  攻城狮凌风  阅读(1508)  评论(0编辑  收藏  举报

导航