您的位置:首页 > 运维架构

OpenCV 学习笔记---基本数据类型

2013-04-14 17:25 585 查看
points, size, rectangle 和 Scalar 三元组的结构

结构

成员

意义

CvPointint x,
y
图像中的点
CvPoint2D32ffloat x,
y
二维空间中的点
CvPoint3D32ffloat x,
y, z
三维空间中的点
CvSizeint width,
height
图像的尺寸
CvRectint x,
y, width,
height
图像的部分区域
CvScalardouble val[4]RGBA 值
构造函数跟类型名相同,区别在于首字母小写。这些构造函数只是内联函数。

cvScalar 有 3 个构造函数
1. cvScalar() 一个、两个、三个、或者四个参数,并将这些参数传递给数组 val[ ] 中相应的元素。
2. cvRealScalar()
一个参数,传递给 val[0] ,val[ ] 数组中其它元素被赋为 0 。
3. cvScalarAll()
一个参数,将 val[ ] 中的四个元素均设为此参数的值。

CvMat 结构:矩阵头

typedef	struct	CvMat {
int	type;				//  类型 CV_<bit_depth>(S|U|F)C<number_of_channels>
int	step; 				// 以字节为单位的行数据长度
int*	refcount; 			// for internal use only
union{					// data 指针,4 种类型
uchar*		ptr;
short*		s;
int*		i;
float*		fl;
double*		db;
}data;
union{					// 行数/高度
int		rows;
int		height;
};
union{					// 列数/宽度
int		cols;
int 		width;
};
} CvMat;


此类信息通常被称作矩阵头。很多程序是区分矩阵头和数据体的,数据体是各个 data 成员所指向的内存位置。

矩阵的创建与释放

// create a new rows by cols matrix of type 'type'
CvMat* cvCreateMat(int rows,int cols,int type);

// create only matrix header without allocating data
Cvmat* cvCreateMatHeader(int rows,int cols,int type);

// initialize header on existing CvMat structure
CvMat* cvInitMatHeader(CvMat* mat,int rows,int cols,int type,void* data = NULL,int step = CV_AUTOSTEP);

// like cvinitmatheader() but allocate CvMat as well
CvMat cvMat(int rows,int cols,int type,void* data = NULL);

// allocate a new matricx just like the matrix 'mat'
CvMate* cvCloneMat(const CvMat* mat);

// free the matrix 'mat', both header and data
void cvReleaseMat(CvMat** mat);


用固定数据创建一个 OpenCV 矩阵

// create an OpenCV Matrix containing some fixed data
float vals[] = {0.866025,-0.500000,0.500000,0.866025};

CvMat rotmat;

cvInitMatHeader(&rotmat,2,2,CV_32FC1,vals);


创建矩阵后,可以对它的简单操作有查询数组定义和数据访问等

int cvGetElemType(const CvArr* arr); // 返回整型常数,表示存储在数组里的元素类型(CV_8UC1 和
CV_64FC4 等类型)

int cvGetDims(const CvArr* arr,int* sizes = NULL); // 返回维数,如果 sizes 不为空,它将存储对应维度的矩阵大小(元素个数)

下面的例子,计算总的元素个数

int sizes[CV_MAX_DIM];
int i, total = 1;
int dims = cvGetDims(arr, size);
for(i = 0; i < dims; i++ ) // 每个维度上的矩阵大小(元素个数)相乘
total *= sizes[i];


int cvGetDimSize(const CvArr* arr,int index); // 返回指定维数上矩阵的大小(元素个数)

矩阵数据的存取

简单方法 ---- 两个宏: // 只适用于 1 维或 2 维数组

// 4 个参数:矩阵、待返回元素的类型、行号和列号
CV_MAT_ELEM()

CvMat* mat = cvCreateMat(5,5,CV_32FC1);
float element_3_2 = CV_MAT_ELEM(*mat, float, 3,2);

// 3 个参数:矩阵、待返回元素的行号和列号。函数返回指向这个元素的指针
// 如需同时读取和设置数据,可直接调用此宏,并将指针转化成恰当类型
CV_MAT_ELEM_PTR()

CvMat* mat = cvCreateMat(5,5,CV_32FC1);
float element_3_2 = 7.7;
*((float*)CV_MAT_ELEM_PTR(*mat,3,2)) = element_3_2;

这些宏在每次调用的时候都重新计算指针。在计划顺序访问矩阵中的所有元素时,这种方法的缺点尤为突出


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: