利用opencv的cvResize对文件夹里所有图片缩放到统一大小
2011-04-22 21:08
501 查看
在训练分类器之前有一步骤是样本的创建,而创建之前须对正样本与副样本缩放到统一大小,如何对整个文件夹里的图片进行批缩放呢?程序如下:
在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;
}
在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;
}
相关文章推荐
- 利用opencv的cvResize对文件夹里所有图片缩放到统一大小
- 利用OPENCV写的对文件夹下所有图片大小归一化的小工具
- 利用OPENCV写的对文件夹下所有图片大小归一化的小工具
- OpenCV/C/C++读取文件夹内所有图或者多张图片
- Python利用OpenCV来进行图片的位移和缩放
- 用python给文件夹下所有图片进行缩放处理
- Py之Crawler:爬虫利用随机选取代理访问服务器的方法实现下载某网址上所有的图片到指定文件夹——Jason niu
- OpenCV学习之例程详解(03):搜索文件夹下所有指定类型图片并逐张显示
- opencv批量输入图片缩放后保存到文件夹里面
- OpenCV实现resize和crop当前文件夹下所有图片
- opencv读取一个文件夹里的所有图片
- 使用OpenCV对文件夹下所有图片进行批量处理
- python程序设计基础5:python文件使用(遍历一个文件夹中所有的图片)
- openCV学习笔记(8):利用cvSetImageROI截取/裁剪图片
- Opencv读取文件夹连续图片,RGB分量显示,图像灰度化
- opencv for python (9) 图片的扩展和缩放 批量处理图片
- Python与C++ 遍历文件夹下的所有图片实现代码
- 将指定文件夹下所有图片转换成base64并返回数组
- OpenCV学习笔记07--用滚动条控制图片缩放
- matlab遍历文件夹下所有图片和遍历所有子文件夹下图片