图像大小变换
在训练分类器之前有一步骤是样本的创建,而创建之前须对正样本与副样本缩放到统一大小,如何对整个文件夹里的图片进行批缩放呢?程序如下:
#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;
}
CvSize结构
CvSize结构表示矩形尺寸的结构,结构体中分别定义了矩形的宽度和高度,具体定义如下:
typedef struct CvSize {
int width; /* 矩形宽度,单位为象素 */
int height; /* 矩形高度,单位为象素 */
}CvSize;
与CvSize结构相关的是其构造函数:
inline CvSize cvSize( int width, int height );
在定义CvSize结构变量时,可以按照如下方式定义:
CvSize size=cvSize(400,300);/* 定义宽为400象素,高为300象素的矩形 */
Cvsize结构用来设置矩形区域大小,在一些复杂高级的结构体常常能够看到它
typedef struct _IplImage
{
int nSize; /* IplImage大小,=sizeof(IplImage)*/
int ID; /* 版本 (=0)*/
int nChannels; /* 大多数OPENCV函数支持1,2,3 或 4 个通道 */
int alphaChannel; /* 被OpenCV忽略 */
int depth; /* 像素的位深度: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,
IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F 可支持 */
char colorModel[4]; /* 被OpenCV忽略 */
char channelSeq[4]; /* 被OpenCV忽略 */
int dataOrder; /* 0 - 交叉存取颜色通道,对三通道RGB图像,像素存储顺序为BGR BGR BGR ... BGR;
1 - 分开的颜色通道,对三通道RGB图像,像素存储顺序为RRR...R GGG...G BBB...B。
cvCreateImage只能创建交叉存取图像 */
int origin; /* 0 - 顶—左结构,
1 - 底—左结构 (Windows bitmaps 风格) */
int align; /* 图像行排列 (4 or 8). OpenCV 忽略它,使用 widthStep 代替 */
int width; /* 图像宽像素数 */
int height; /* 图像高像素数*/
struct _IplROI *roi;/* 图像感兴趣区域. 当该值非空只对该区域进行处理 */
struct _IplImage *maskROI; /* 在 OpenCV中必须置NULL */
void *imageId; /* 同上*/
struct _IplTileInfo *tileInfo; /*同上*/
int imageSize; /* 图像数据大小(在交叉存取格式下imageSize=image->height*image->widthStep),单位字节*/
char *imageData; /* 指向排列的图像数据 */
int widthStep; /* 排列的图像行大小,以字节为单位 */
int BorderMode[4]; /* 边际结束模式, 被OpenCV忽略 */
int BorderConst[4]; /* 同上 */
char *imageDataOrigin; /* 指针指向一个不同的图像数据结构(不是必须排列的),是为了纠正图像内存分配准备的 */
}
IplImage;