zoukankan      html  css  js  c++  java
  • 利用opencv的cvResize对文件夹里所有图片缩放到统一大小

    训练分类器之前有一步骤是样本的创建,而创建之前须对正样本与副样本缩放到统一大小,如何对整个文件夹里的图片进行批缩放呢?程序如下:

    在VC6.0+opencv2.1运行没问题,

    在vs2010下面出现如下错误:

    error C2440: 'initializing' : cannot convert from 'WCHAR [260]' to 'std::basic_string<_Elem,_Traits,_Ax>'

    解决方法:这是由项目使用的字符编码所至的问题,使用unicode时,LPSTR p = str.getBuffer(len + 1)便会出现这个错误,解决方法是将Project Properties中的Configureation Properties->General->Character Set = Not Set,重新编译即可

    #include <iostream>
    #include <windows.h>
    #include <string>
    #include <cv.h>

    #include <highgui.h>

    using namespace std;
    long cc=0;  //存储图片的名字 1.jpg 2.jpg ....
    void FindFile(string filename,const string filter);

    void Setsize(string filename)   //利用opencv的cvResize函数对图像进行缩放
    {
     IplImage *src = 0; //源图像指针 
     IplImage *dst = 0; //目标图像指针 
     float scale = 0.618; //缩放倍数为0.618倍 
     CvSize dst_cvsize; //目标图像尺寸

      
     cc++; 
     char temp[64];
     string str1;
     string str2;
     sprintf(temp, "%d",cc);
     str1=temp; 
     

     src = cvLoadImage(filename.c_str()); //
     dst_cvsize.width = 32; //目标图像的宽为固定 32 像素 
     dst_cvsize.height = 24;//src->height * ((float)dst_cvsize.width/src->width); // 高同比例放大  
     dst = cvCreateImage( dst_cvsize, src->depth, src->nChannels); //构造目标图象 
     
     cvResize(src, dst, CV_INTER_LINEAR); //缩放源图像到目标图像 
     sprintf(temp, "E://pic//neg");
     str2=temp; 
     filename=str2+"//" +str1+".jpg"; //str2="e://pic//。.."
     cvSaveImage(filename.c_str(),dst); //缩放后保存的位置
     
     /*
     cvNamedWindow( "src", CV_WINDOW_AUTOSIZE ); //创建用于显示源图像的窗口 
     cvNamedWindow( "dst", CV_WINDOW_AUTOSIZE ); //创建用于显示目标图像的窗口 
     cvShowImage( "src", src ); //显示源图像
     cvShowImage( "dst", dst ); //显示目标图像
     cvReleaseImage(&src); //释放源图像占用的内存 
     cvReleaseImage(&dst); //释放目标图像占用的内存 
     cvDestroyAllWindows(); 
     */
     cvWaitKey(-1); //等待用户响应 
     
    }

    void FindFile(string filename,string filter)  //遍历文件夹里头所有的jpg文件 。
    {   
     WIN32_FIND_DATA findfiledate;  // data buffer 
     HANDLE hfind=INVALID_HANDLE_VALUE;  
     if(filename[filename.length()-1]!='//')
      filename+='//';   
     string lpFileName=filename + "//" + filter;     //If the function fails, the return value is INVALID_HANDLE_VALUE   
     hfind=FindFirstFile(lpFileName.c_str(),&findfiledate);  
     if(hfind==INVALID_HANDLE_VALUE) return ;    
     while(true)   
     {        //判断是文件还是文件夹   
      if(findfiledate.dwFileAttributes>=32)     
      {         
       cout <<"文件:" <<findfiledate.cFileName;  
       cout <<'/t' <<"&&"<<filename <<"77"<<lpFileName<<endl; 
       lpFileName=filename + "//" +findfiledate.cFileName;
       Setsize(lpFileName);  //缩放图片
      }     
      //如果是文件夹
      else      
      {       
       //如果不是上级目录     
       string fname=findfiledate.cFileName;
       if(fname!="." && fname!="..")     
       {          
        lpFileName=filename+fname;  
        FindFile(lpFileName,filter);
        
       }   
      }               
      //查找下一个成功返回非0,否则返回0    
      int result=FindNextFile(hfind,&findfiledate); 
      if(result==0) break;       
     } 
     FindClose(hfind); 
     //释放句柄   
     return ; 
    }

    int main(int argc,char* argv[])
    {       
     string directory="E://original(1)//original//neg//ch00_20110121092157"; //要找文件的目录
     string filter="*.jpg";  //.jpg后缀的文件
     FindFile(directory,filter);  
     return 0;
    }

  • 相关阅读:
    千万数量级分页存储过程(效果演示)
    hibernate注解实体类(Dept.java)
    hibernate注解实体类(Dept.java)
    hibernate注解的测试
    hibernate注解的测试
    hibernate注解的测试
    Hibernate中使用Criteria查询及注解——( EmpCondition)
    Hibernate中使用Criteria查询及注解——( EmpCondition)
    Hibernate中使用Criteria查询及注解——( EmpCondition)
    Hibernate中使用Criteria查询及注解——(DeptTest.java)
  • 原文地址:https://www.cnblogs.com/yingying0907/p/2126086.html
Copyright © 2011-2022 走看看