opencv初探(二)

矩阵数据的存取

简单的方法:

利用宏CV_MAT_ELEM()传入矩阵、待提取元素的类型、行和列数

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

CV_MAT_ELEM_PTR()宏与此宏类似,传入矩阵和待提取元素的行和列数,返回指向这个元素的指针
最重要的区别是CV_MAT_ELEM()宏在指针解引用之前将其转化成指定的类型。如果需要同时读取数据和设置数据,可以直接调用CV_MAT_ELEM_PTR()。但在这种情况下,必须自突出。己将指针转化成恰当的类型。

利用宏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;

以上两个宏都仅仅适用于访问1维或者2维的数组。
这些宏在每次调用的时候都重新计算指针。这意味着查
找指向矩阵基本元素数据区的指针、计算目标数据在矩阵中的相对地址,然后将相对位置与基本位置相加。所以,这些宏虽然容易使用但是不是存取矩阵的最佳方法。在计划顺序访问矩阵中的所有元素时,这种方法的缺点尤为突出。

为了访问普通矩阵中的数据,我们可以利用cvPtr*D和cvGet*D等函数族。cvPtr*D家族包括cvPtr1D(),cvPtr2D()..cvPtrnD().这三个函数都可以接收CvArr*类型的矩阵指针参数,紧随其后的参数是表示索引的整数值,最后一个是可选的参数,他表示输出值的类型。函数返回一个指向所需元素的指针。

cvPtr*D函数用于返回指向某数组元素的指针

uchar* cvPtr1D( const CvArr* arr, int idx0, int* type=NULL );
uchar* cvPtr2D( const CvArr* arr, int idx0, int idx1, int* type=NULL );
uchar* cvPtr3D( const CvArr* arr, int idx0, int idx1, int idx2, int* type=NULL );
uchar* cvPtrND( const CvArr* arr, int* idx, int* type=NULL, int create_no

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值