zoukankan      html  css  js  c++  java
  • 基于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;
    }


  • 相关阅读:
    javascript--Date
    PL/SQL的命令行窗口中执行脚本
    关于资产新增接口问题描述
    ORA-00600: internal error code, arguments: [kqludp2], [0x08D226918], [0], [], [], [], [], [], [], [], [], []
    Oracle 表空间扩容
    EBS 创建会计科目 小结
    EBS AP 创建会计科目失败
    EBS GL 日记账行“账户说明”段说明显示不全
    EBS 修改系统名称
    EBS 修改系统颜色
  • 原文地址:https://www.cnblogs.com/engineerLF/p/5393146.html
Copyright © 2011-2022 走看看