IplImage是openCV库中非常重要的一个结构体,库中的图像都是保存为这个结构体后再进行操作的,详细结构例如以下:

</pre><pre>

typedef struct _IplImage
{
int nSize; /* 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]; /* 同上 */
int dataOrder; /* 0 - 交叉存取颜色通道, 1 - 分开的颜色通道. 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;

由cvCreateImage()来创建包括头与数据内存,而cvCreateImageHeader则是仅仅创建结构头,当能够预先分配好内存然后使用cvSetData影射到IplImage上。正是这个结构非常重要,可是非常人在使用IplImage对象时申请了内存会常常忘记释放内存。我在下提供一个封装好的IplImage类:

class  CVImage
{
public :
CVImage();
CVImage(unsigned int width, unsigned int height, unsigned short depth, unsigned short nChannels = 3);
CVImage(CVImage& img);
~CVImage(); void ReleaseImage();
int Resize(unsigned int width, unsigned int height, unsigned short depth, unsigned short nChannels = 3); operator IplImage*() { return m_image; };
inline IplImage* GetImage() { return m_image; }; private:
IplImage* m_image;
};
CVImage.cpp
CVImage::CVImage() : m_image(NULL)
{
} CVImage::CVImage( unsigned int width, unsigned int height, unsigned short depth, unsigned short nChannels ) : m_image(NULL)
{
Resize(width, height, nChannels);
} CVImage::CVImage( CVImage& img)
{
IplImage* tmpImg = img.GetImage(); if(m_image)
{
if(m_image->width != tmpImg->width || m_image->height != tmpImg->height)
{
cvReleaseImage(&m_image);
}
}
m_image = cvCloneImage(tmpImg);
} CVImage::~CVImage()
{
ReleaseImage();
} void CVImage::ReleaseImage()
{
if(m_image)
{
cvReleaseImage(&m_image);
}
} int CVImage::Resize( unsigned int width, unsigned int height, unsigned short depth, unsigned short nChannels)
{
if(0 == width || 0 == height || 0 == depth || 0 == nChannels)
return -1; if(m_image)
{
if(width != m_image->width || height != m_image->height)
ReleaseImage();
}
m_image = cvCreateImage(cvSize(width, height), depth, nChannels); return NULL == m_image ? -1 : 0;
}

最新文章

  1. EF Load之详讲
  2. U盘安装操作系统
  3. Solving “Dynamic Web Module 3.0 requires Java 1.6 or newer” in Maven Projects
  4. java 字符串zlib压缩/解压
  5. SharePoint 2013 企业搜索架构示例
  6. 解决json包含html标签无法显示的问题
  7. Javascript事件处理进阶
  8. 脚本两则--用于快速部署HADOOP,SPARK这些(特别是VM虚拟机模板部署出来的)。。
  9. C#中MessageBox用法总结
  10. CSS3框架!
  11. WPF如何获得变量异步回调函数时产生的异步回调
  12. 如何使用 toml 配置 SpaceVim
  13. luogu P2617 Dynamic Rankings &amp;&amp; bzoj 1901 (带修改区间第k大)
  14. ISP PIPLINE (四) Demosaic
  15. Django 之 cookie和session
  16. C#程序中设置全局代理(Global Proxy)
  17. vue学习之router
  18. AndroidStudio相关经验记录
  19. ubuntu修改运行级别方法
  20. [ACM_水题] UVA 12502 Three Families [2人干3人的活后分钱,水]

热门文章

  1. 生产都消费者模式的一个demo,消费者设置缓存
  2. iOS开发无第三方控件的援助达到的效果侧边栏
  3. 有关windows在调试ODOO8.0有些问题
  4. Mac周边环境 goBASIC语言HelloWorld
  5. MVC5中使用SignalR2.0实现实时聊天室
  6. 基于hadoop的电影推荐结果可视化
  7. 【POJ3268】Silver Cow Party 最短
  8. 对java中classloader使用的一点理解(转)
  9. hdu 1025 Constructing Roads In JGShining’s Kingdom 【dp+二分法】
  10. 在ASP.NET2.0里打印网页指定的内容(比如打印网页里的一个Table)