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

posted @ 2011-08-03 13:27  微雪  阅读(4990)  评论(0编辑  收藏  举报