现在的位置: 首页 > 综合 > 正文

利用opencv的cvResize对文件夹里所有图片缩放到统一大小

2013年08月24日 ⁄ 综合 ⁄ 共 2709字 ⁄ 字号 评论关闭

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

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

抱歉!评论已关闭.