CvArr CvMat IplImage 三种数据类型
来源:互联网 发布:手机端淘宝怎么写代码 编辑:程序博客网 时间:2024/06/08 21:54
在opencv h文件里是这样定义 CvArr :
/* CvArr* is used to pass arbitrary
* array-like data structures
* into functions where the particular
* array type is recognized at runtime:
*/
typedef void CvArr;
CvMat 如下定义:
typedef struct CvMat
{
int type;
int step;
/* for internal use only */
int* refcount;
int hdr_refcount;
union
{
uchar* ptr;
short* s;
int* i;
float* fl;
double* db;
} data;
#ifdef __cplusplus
union
{
int rows;
int height;
};
union
{
int cols;
int width;
};
#else
int rows;
int cols;
#endif
}
CvMat;
IplImage 如下定义:
typedef struct _IplImage
{
int nSize; /* sizeof(IplImage) */
int ID; /* version (=0)*/
int nChannels;
int alphaChannel;
int depth;
char colorModel[4];
char channelSeq[4];
int dataOrder;
int origin;
int align;
int width;
int height;
struct _IplROI *roi;
struct _IplImage *maskROI;
void *imageId;
struct _IplTileInfo *tileInfo;
int imageSize;
char *imageData;
int widthStep;
int BorderMode[4];
int BorderConst[4];
char *imageDataOrigin;
}
IplImage;
========================================
CvArr 竟然是 void 在opencv的大部分函数中经常用到CvArr * 其实也就是 void * 指针 ,在 c中 void * 指针可以被其他类型的指针赋值,狂汗-_-|||,这就是所说的可以被称为一个抽象基类。
opencv 的编写采用oop思想,其实也就是 抽象数据类+该类的操作方法(ADT),“CvMat与IplImage之间的关系可以被认为是C++的继承关系”(《学习opencv》),从感官上可以理解为两者都是对一堆0、1数字的包装。CvMat更普遍,IplImage者具体针对图像。从普遍到特殊,这就是继承。
不知道大家是怎么理解的???
CvArr、Mat、CvMat、IplImage、BYTE转换(总结而来)
(2012-04-13 12:52:42)opencv
常见问题
杂谈
分类: opencv转载自http://blog.csdn.net/wuxiaoyao12/article/details/7305848
一、Mat类型:矩阵类型,Matrix。
A.Mat
同样只是创建图像头,而没有复制数据。
例:
IplImage
B.Mat
与IplImage的转换类似,不复制数据,只创建矩阵头。
例: //
二、CvMat类型与IplImage类型:“图像”类型
补充:IplImage由CvMat派生,而CvMat由CvArr派生即CvArr
1.CvMat
A.CvMat->
IplImage*
cvGetImage(matI,img);
cvSaveImage("rice1.bmp",img);
B.CvMat->Mat
与IplImage的转换类似,可以选择是否复制数据。
Mat::Mat(const
在openCV中,没有向量(vector)的数据结构。任何时候,但我们要表示向量时,用矩阵数据表示即可。
但是,CvMat类型与我们在线性代数课程上学的向量概念相比,更抽象,比如CvMat的元素数据类型并不仅限于基础数据类型,比如,下面创建一个二维数据矩阵:
这里的type可以是任意的预定义数据类型,比如RGB或者别的多通道数据。这样我们便可以在一个CvMat矩阵上表示丰富多彩的图像了。
2.IplImage
在类型关系上,我们可以说IplImage类型继承自CvMat类型,当然还包括其他的变量将之解析成图像数据。
IplImage类型较之CvMat多了很多参数,比如depth和nChannels。在普通的矩阵类型当中,通常深度和通道数被同时表示,如用32位表示RGB+Alpha.但是,在图像处理中,我们往往将深度与通道数分开处理,这样做是OpenCV对图像表示的一种优化方案。
IplImage的对图像的另一种优化是变量origin----原点。在计算机视觉处理上,一个重要的不便是对原点的定义不清楚,图像来源,编码格式,甚至操作系统都会对原地的选取产生影响。为了弥补这一点,openCV允许用户定义自己的原点设置。取值0表示原点位于图片左上角,1表示左下角。
dataOrder参数定义数据的格式。有IPL_DATA_ORDER_PIXEL和IPL_DATA_ORDER_PLANE两种取值,前者便是对于像素,不同的通道的数据交叉排列,后者表示所有通道按顺序平行排列。
IplImage类型的所有额外变量都是对“图像”的表示与计算能力的优化。
A.IplImage
IplImage*
Mat
B.IplImage
法1:CvMat
法2:CvMat
C.IplImage*->
BYTE*
CvMat和IplImage创建时的一个小区别:
1、建立矩阵时,第一个参数为行数,第二个参数为列数。
CvMat*
2、建立图像时,CvSize第一个参数为宽度,即列数;第二个参数为高度,即行数。这 个和CvMat矩阵正好相反。
IplImage*
CvSize
IplImage内部buffer每行是按4字节对齐的,CvMat没有这个限制
补充:
A.BYTE*->
img=
cvSetData(img,data,step);
//首先由cvCreateImageHeader()创建IplImage图像头,制定图像的尺寸,深度和通道数;
//然后由cvSetData()根据BYTE*图像数据指针设置IplImage图像头的数据数据,
//其中step指定该IplImage图像每行占的字节数,对于1通道的IPL_DEPTH_8U图像,step可以等于width。
- ,第一次看的时候没看懂,第二次看的时候看看懂了,楼主写的很详细,谢谢
A.IplImage-> Mat
IplImage*pImg = cvLoadImage("lena.jpg");
Matimg(pImg,0); // 0是不複製影像,也就是pImg與img的data共用同個記憶體位置,header各自有
B.IplImage-> CvMat
法1:CvMatmathdr, *mat = cvGetMat( img, &mathdr );
法2:CvMat*mat = cvCreateMat( img->height, img->width, CV_64FC3 );
cvConvert(img, mat );我试了这两个方式都不能 正确得到CvMat* mat ,如果我有Mat m, CvMat n=m,CvMat * b=&n;这样又可以编译通过,不知道楼主尝试过没?
- CvArr CvMat IplImage 三种数据类型
- CvMat, Mat, IplImage, Cvarr类型
- CvArr, CvMat, IplImage关系
- CvMat, CvArr、Mat, IplImage
- opencv不同深度CvArr*(CvMat*,IplImage*)类型的显示
- opencv不同深度CvArr*(CvMat*,IplImage*)类型的显示
- CvArr、Mat、CvMat、IplImage、转换
- opencv的三种数据结构CvMat IplImage Mat 读取示例
- CvArr、Mat、CvMat、IplImage、BYTE转换
- CvArr、Mat、CvMat、IplImage、BYTE转换
- CvArr、Mat、CvMat、IplImage、BYTE转换
- CvArr、Mat、CvMat、IplImage、BYTE转换
- CvArr、Mat、CvMat、IplImage、BYTE转换
- CvArr、Mat、CvMat、IplImage、BYTE转换
- CvArr、Mat、CvMat、IplImage、BYTE转换
- CvArr、Mat、CvMat、IplImage、BYTE转换_OpenCV
- CvArr、Mat、CvMat、IplImage、BYTE转换
- CvArr、Mat、CvMat、IplImage、BYTE转换
- ant.jar打ZIP包
- ora-03135
- How to check whether the patches have been applied or not
- OpenCV码源笔记——(letter_recog.cpp)随机Forest部分
- 如何去掉Powered by ECShop v2.7.1
- CvArr CvMat IplImage 三种数据类型
- Application Security Logging
- Android build.prop生成过程
- 一个死锁的问题
- MFC 更改系统图标
- 新浪微博开发(五)AppList界面
- STL经典算法集锦<五>之查找(lower_bound/upper_bound/binary_search)
- 常用软件-svn客户端
- 字符串的输入注意