opencv 基础结构Iplimage cvMat Mat

一、Mat类型:矩阵类型,Matrix。

       在openCV中,Mat是一个多维的密集数据数组。可以用来处理向量和矩阵、图像、直方图等等常见的多维数据。

       Mat类型较CvMat与IplImage类型来说,有更强的矩阵运算能力,支持常见的矩阵运算。在计算密集型的应用当中,将CvMat与IplImage类型转化为Mat类型将大大减少计算时间花费。关于Mat的数学方面的函数略过。

 

二、CvMat类型  IplImage类型 cvArr类型

      在openCV中,Mat类型与CvMat和IplImage类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化。而CvMat和IplImage类型更侧重于“图像”,openCV对其中的图像操作(缩放、单通道提取、图像阈值操作等)进行了优化。 

       我们知道openCV是完全用C实现的,但是,IplImage类型与CvMat类型的关系就像是java(C++?)中的继承关系。

       实际上,CvMat之上还有一个更抽象的基类----CvArr,这在源代码中会常见。CvArr  竟然是 void  在opencv的大部分函数中经常用到CvArr *  其实也就是 void * 指针 ,在 c中 void * 指针可以被其他类型的指针赋值,这就是所说的可以被称为一个抽象基类。

       图像的类型的形式是:       CV_<bit数> (S|U|F)C<通道数>

       例如,数据类型可能是CV32FC1,即32bit的浮点数,或CV_8UC3,8bit的无符号整数,或 CV_8UC3,无符号8bit整数,3通道,等等

typedef struct CvMat
{
	int type;
	int step;
	int* 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;

typedef struct _IplImage
{
	int nSize;
	int ID;
	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;

typedef void CvArr;

三。

//方式一:直接数组操作 
int col, row, z; 
uchar b, g, r;  
for( y = 0; row < img->height; y++ ) 
{     
	for ( col = 0; col < img->width; col++ )   
	 {      
			b = img->imageData[img->widthStep * row + col * 3]      
			g = img->imageData[img->widthStep * row + col * 3 + 1];     
			r = img->imageData[img->widthStep * row + col * 3 + 2];    
	  } 
}  

//方式二:宏操作:
int row, col;
uchar b, g, r;  
for( row = 0; row < img->height; row++ ) 
{     
	for ( col = 0; col < img->width; col++ )  
	{       
		b = CV_IMAGE_ELEM( img, uchar, row, col * 3 );    
		g = CV_IMAGE_ELEM( img, uchar, row, col * 3 + 1 );     
		r = CV_IMAGE_ELEM( img, uchar, row, col * 3 + 2 );    
	} 
}  
          
//注:CV_IMAGE_ELEM( img, uchar, row, col * img->nChannels + ch )  


关于Mat的结构介绍

http://ggicci.blog.163.com/blog/static/210364096201261052543349/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值