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;

重要结构元素说明:

depth和nChannels

depth代表颜色深度,使用的是以下定义的宏,nChannels是通道数,为1,2,3或4。

depth的宏定义:

IPL_DEPTH_8U,无符号8bit整数(8u)

IPL_DEPTH_8S,有符号8bit整数(8s)

IPL_DEPTH_16S,有符号16bit整数(16s)

IPL_DEPTH_32S,有符号32bit整数(32s)

IPL_DEPTH_32F,32bit浮点数,单精度(32f)

IPL_DEPTH_64F,64bit浮点数,双精度(64f)

(注:这里的颜色深度是指单个通道的数据保存为的变量类型,例如RGB24格式的数据,通道数为3,颜色深度为IPL_DEPTH_8U)

origin和dataOrder

origin变量可以有两个取值:IPL_ORIGIN_TL或者IPL_ORIGIN_BL,分别代表图像坐标系原点在左上角或是左下角。相应的,在计算机视觉领域,一个重要的错误来源就是原点位置的定义不统一。例如,图像的来源不同,操作系统不同,视频解码codec不同,存储方式不同等等,都可以造成原点位置的变化。例如,你可能认为你正在从图像上面的脸部附近取样,但实际上你却在图像下方的裙子附近取样。最初时,就应该检查一下你的系统中图像的原点位置,这可以通过在图像上方画个形状等方式实现。

dataOrder的取值可以是IPL_DATA_ORDER_PIXEL或者IPL_DATA_ORDER_PLANE,这个成员变量定义了多通道图像数据存储时颜色数据的排列方式,如果是IPL_DATA_ORDER_PIXEL,通道颜色数据排列将会是BGRBGR...的交错排列,如果是IPL_DATA_ORDER_PLANE,则每个通道的颜色值在一起,有几个通道,就有几个“颜色平面”。大多数情况下,通道颜色数据的排列是交错的。

widthStep与CvMat中的step类似,是以字节数计算的图像的宽度。成员变量imageData则保存了指向图像数据区首地址的指针。

最后还有一个重要参数roi(region of interest

感兴趣的区域),这个参数是IplROI结构体类型的变量。IplROI结构体包含了xOffset,yOffset,height,width,coi成员变量,其中xOffset,yOffset是x,y坐标,coi代表channel

of

interest(感兴趣的通道)。有时候,OpenCV图像函数不是作用于整个图像,而是作用于图像的某一个部分。这是,我们就可以使用roi成员变量了。如果IplImage变量中设置了roi,则OpenCV函数就会使用该roi变量。如果roi被设置成非零值,则对该图像的操作就只作用于被roi指定的通道上了。不幸的是,许多OpenCV函数忽略了coi的值。

访问图像中的数据

就象访问矩阵中元素一样,我们希望用最直接的办法访问图像中的数据,例如,如果我们有一个三通道HSV图像(HSV色彩属性模式是根据色彩的三个基本属性:色相H、饱和度S和明度V来确定颜色的一种方法),我们要将每个点的饱和度和明度设置成255,则我们可以使用指针来遍历图像,请对比一下,与矩阵的遍历有何不同:

void sat_sv( IplImage* img ) {

for( int y=0; y

{

uchar* ptr =

(uchar*) (

img->imageData + y * img->widthStep

//指向第y行

);

for( int

x=0; x

ptr[3*x+1] = 255;

ptr[3*x+2] = 255;

}

}

}

注意一下,3*x+1,3*x+2的方法,因为每一个点都有三个通道,所以这样设置。另外imageData成员的类型是uchar*,即字节指针类型,所以与CvMat的data指针类型(union)不同,而不需要象CvMat那样麻烦(还记得step/4,step/8的那种情形吗)。

roi和widthStep

roi和widthStep在实际工作中有很重要的作用,在很多情况下,使用它们会提高计算机视觉代码的执行速度。这是因为它们允许对图像的某一小部分进行操作,而不是对整个图像进行运算。在OpenCV中,所有的对图像操作的函数都支持roi,如果你想打开roi,可以使用函数cvSetImageROI(),并给函数传递一个矩形子窗口。而cvResetImageROI()是用于关闭roi的。

void cvSetImageROI(IplImage* image,CvRect rect);

void cvResetImageROI(IplImage* image);

注意,在程序中,一旦使用了roi做完相应的运算,就一定要用cvResetImageROI()来关闭roi,否则,其他操作执行时还会使用roi的定义。

opencv图片保存0字节_Opencv中IplImage存储方式介绍相关推荐

  1. opencv图片保存0字节_openCV将8bit(1像素对应8bit)图像保存为1bit(1像素对应1bit)...

    前言 openCV处理的图像最小的位深度都是8,即每个像素的灰度值要用8bit存储,二值化处理的图像也是用8bit来存储每个像素的灰度值(0代表黑色,255代表白色),为什么不能用0和1表示呢,即每个 ...

  2. python如何读取tfrecord_tensorflow将图片保存为tfrecord和tfrecord的读取方式

    tensorflow官方提供了3种方法来读取数据: 预加载数据(preloaded data):在TensorFlow图中定义常量或变量来保存所有的数据,适用于数据量不太大的情况.填充数据(feedi ...

  3. java解析tfrecord_tensorflow将图片保存为tfrecord和tfrecord的读取方式

    tensorflow官方提供了3种方法来读取数据: 预加载数据(preloaded data):在TensorFlow图中定义常量或变量来保存所有的数据,适用于数据量不太大的情况.填充数据(feedi ...

  4. C语言的数据类型大全,整型数据在内存中的存储方式

    一.数据类型 通过长时间的学习C语言以及代码的编写,我掌握了很多很多的数据类型,下面就给大家罗列一下. 1.内置数据类型 char        //字符数据类型--                  ...

  5. c++全局类对象_C++ 类在内存中的存储方式(一)

    说了这么久的 C++ 终于说到类了,还是从内存出发来讨论一下 C++ 的类在内存中的存储方式(之前写过一篇内存对齐的文章,类同样在一定程度上遵循内存对齐原则,不过比结构体复杂一下) 如有侵权,请联系 ...

  6. IEEE754标准: 浮点数在内存中的存储方式

    一. 什么是IEEE754标准 我们知道, 计算机内部实际上只能存储或识别二进制. 在计算机中, 我们日常所使用的文档, 图片, 数字等, 在储存时, 实际上都要以二进制的形式存放在内存或硬盘中, 内 ...

  7. c语言double数据存储形式,C语言 float、double数据在内存中的存储方式

    float在内存中占4个字节(32bit),32bit=符号位(1bit)+指数位(8bit)+底数位(23bit) 指数部分 指数位占8bit,可以表示数值的范围是0-(表示0~255一共256个数 ...

  8. C/C++中涉及存储方式的关键字:auto,static,register,extern2009-01-22 11:23auto关键字:

    C/C++中涉及存储方式的关键字:auto,static,register,extern 2009-01-22 11:23 auto关键字: auto对象和变量被存储在栈中,它的生命周期仅存在于它的声 ...

  9. C/C++浮点数在内存中的存储方式《转》

    那天有人在汇编群里有人问了一个 #include <iostream> #include <stdio.h> using namespace std; int main() { ...

  10. 【C语言】浮点型数据在内存中的存储方式

    目录 一. 前言 二. 问题的引出 三. 两类浮点型数据(float.double)在内存中的存储方式 3.1 两类浮点型数据的存储模型 3.1.1 浮点型数据数值读取的通用模型 3.1.2 floa ...

最新文章

  1. IT基础结构-1.DC-DNS-安装
  2. EYQiPa,梦开始的地方
  3. python中scrapy是什么_python爬虫中scrapy组件有哪些?作用是什么?
  4. ajax实时刷新处理
  5. http 标准超时时间_Go 中 http 超时问题的排查
  6. 深入学习Make命令和Makefile(上)
  7. 益智小游戏(app)
  8. linux常用命令备忘(不断更新中...)
  9. OpenWrt 编译分割
  10. 企业治理的要诀(学习总结)
  11. mysql all和distinct_mysql distinct 使用实例(过滤多余的重复记录)
  12. 在Latex中插入FontAwesome图标
  13. 在家如何下载nature中的文献
  14. 论文阅读七:面向软件定义网络的负载均衡智能路由策略
  15. 影片剪辑实例名的几点注意
  16. 2018百度云智峰会,为什么百度大脑站C位?
  17. R 加权最小二乘 代码_如何用EXCEL的规划求解功能优化投资组合的阿尔法值(最小二乘估计法)?...
  18. AutoCAD二次开发:ObjectArx下的两种命令注册方式
  19. 小波调研(三):小波阈值去噪分析
  20. 【算法•日更•第九期】树型动态规划详解:二叉苹果树

热门文章

  1. VISA/MasterCard/AE/DC/JCB卡号结构
  2. 图的深度优先遍历和广度优先遍历算法流程图
  3. 如何在数据库中添加示例数据库Northwind
  4. linux中bash命令是什么,linux中bash是什么意思?
  5. Android 静默安装的几种方式
  6. 其他干货——文章投稿之图片格式-位图vs.矢量图
  7. 关于ScreenToClient
  8. sax解析xml详解
  9. id导出pdf失败_indesign导出pdf失败怎么办
  10. android实战:密码箱三