opencv中的cvResize函数,cvSize结构体,IplImage结构体

cvResize函数--图象放缩

图像大小变换

  1. void cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR );  

 src:输入图像. 
dst:输出图像. 
interpolation:差值方法: 
• CV_INTER_NN - 最近邻差值, 
• CV_INTER_LINEAR -  双线性差值 (缺省使用) 
• CV_INTER_AREA -  使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于  CV_INTER_NN  方法.. 
• CV_INTER_CUBIC -  立方差值. 
函数  cvResize 将图像  src 改变尺寸得到与  dst 同样大小。若设定ROI,函数将按常规支持 ROI.
 

实例代码:

[cpp]  view plain  copy
  1. #include <stdio.h>  
  2. #include <cv.h>  
  3. #include <cxcore.h>  
  4. #include <highgui.h>  
  5.   
  6. #pragma comment(lib, "cv.lib")  
  7. #pragma comment(lib, "cxcore.lib")  
  8. #pragma comment(lib, "highgui.lib")  
  9.   
  10. int main(int argc,char **argv)  
  11. {  
  12.     IplImage *src = cvLoadImage("test.png");  
  13.     IplImage *desc;  
  14.     CvSize sz;  
  15.     double scale = 0.5;  
  16.     if(src)  
  17.     {  
  18.         sz.width = src->width*scale;  
  19.         sz.height = src->height*scale;  
  20.         desc = cvCreateImage(sz,src->depth,src->nChannels);  
  21.         cvResize(src,desc,CV_INTER_CUBIC);  //立方插值
  22.         cvNamedWindow("src",CV_WINDOW_AUTOSIZE);  
  23.         cvNamedWindow("desc",CV_WINDOW_AUTOSIZE);  
  24.         cvShowImage("src",src);  
  25.         cvShowImage("desc",desc);  
  26.         cvWaitKey(0);  
  27.   
  28.         cvReleaseImage(&src);  
  29.         cvReleaseImage(&desc);  
  30.         cvDestroyWindow("src");  
  31.         cvDestroyWindow("desc");  
  32.         return 0;  
  33.     }  
  34.     return -1;  
  35. }  

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

#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结构用来设置矩形区域大小,在一些复杂高级的结构体常常能够看到它

IplImage结构体


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;

常用的六个函数

1. 图像载入函数
函数 cvLoadImage载入指定图像文件,并返回指向该文件的IplImage指针。函数支持bmp、jpg、 png、 tiff等格式的图像。其函数原型如下:
IplImage* cvLoadImage( const char* filename, int iscolor);
其中,filename 是待载入图像的名称,包括图像的扩展名;iscolor是一个辅助参数项,可选正数、零和负数三种值,正数表示作为三通道图像载入,零表示该图像作为单通道图像,负数表示载入图像的通道数由图像文件自身决定。
2. 窗口定义函数
函数cvNamedWindow定义一个窗口,用于显示图像。其函数原型如下:
int cvNamedWindow( const char* name, unsigned long flags );
其中,name是窗口名,flags是窗口属性指标值,可以选择CV_WINDOW_AUTOSIZE和0两种值。CV_WINDOW_AUTOSIZE表示窗口尺寸与图像原始尺寸相同,0表示以固定的窗口尺寸显示图像。
3. 图像显示函数
函数cvShowImage是在指定的窗口中显示图像,其函数原型如下:
void cvShowImage( const char* name, const CvArr* image );
其中,name是窗口名称,image是图像类型 指针,一般是IplImage指针。
4. 图像保存函数
函数cvSaveImage以指定的文件名保存IplImage类型的 指针变量,其函数原型如下:
int cvSaveImage( const char* filename, const CvArr* image );
其中,filename是图像保存路径和名称,image是IplImage指针变量。
5. 图像销毁函数
函数cvReleaseImage销毁已定义的IplImage指针变量,释放占用内存空间。其函数原型如下:
void cvReleaseImage( IplImage** image );
其中,image为已定义的IplImage指针。
6. 图像转换函数
cvGetImage( const CvArr* arr, IplImage* image_header )


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值