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