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

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值