用固定数据创建一个Opencv矩阵并访问其数据元素

今天学习opencv基本数据类型的时候,利用固定数据创建一个Opencv矩阵

float vals[ ]={0.86,-0.50,0.50,0.86};
CvMat rotmat;
cvInitMatHeader(&rotmat,2,2,CV_32FC1,vals);
float a=CV_MAT_ELEM(*rotmat,float,1,1);

在VC6.0,opencv1.0版本中,弹出错误 error C2100: illegal indirection,貌似是由于使用宏而出错,具体原因没有查到,在此处记录,如果以后学习中解决了此问题,会更改

下面是通过函数cvGetND和cvPtrND,直接得到矩阵元素

#include "cxcore.h"
#include "cv.h"
#include "stdio.h"
int main()
{
	float vals[ ]={1,2,2,6};
	CvMat rotmat;
	cvInitMatHeader(&rotmat,2,2,CV_32FC1,vals);

	/*下面这两种访问方式都可以成功得到矩阵元素*/
	// float a=(cvGet1D(&rotmat,2)).val[0];
	float *a=(float *)cvPtr1D(&rotmat,2);
	printf("%f",*a);
	return 0;
}


/*对上面函数说明如下*/

对于cvPtrND()来说,第二个参数是一个指向一个整型数组的指针,这个数组中包含索引的合适数字(个人理解就是索引号)

结构举例

uchar * cvPtr2D(

     const CvArr   *arr,

     int                index0,

     int                index1,

     int                * type=NULL

);

而关于cvGetND函数,使用方法与cvPtrND类似,需要注意的是,cvGetND函数返回的是CvScalar类型数据。这意味着在使用这些函数的时候,会有很大的空间浪费,所以,只有自己认为用这些函数比较方便和高效率的时候才使用他们,一般最好用cvPtrND


出现错误后首先了解关于opencv中的基本数据类型如下,同时需要注意的是cvInitMatHeader函数数据类型必须为单通道的。

类:DataType
    OpenCV原始数据类型的特征模版。OpenCV的原始数据类型包括unsigned char、bool、signed char、unsigned short、signed short、int、float、double以及由这些基础类型组成的元组,这些元组中的所有值都属于相同的类型。这个原始数据类型列表中的所有类型都可以使用一个标示符进行表示CV_<bit-depth>{U|S|F}C(<number_of_channels>),例如,uchar ~ CV_8UC1,3元素的浮点元组~ CV_32FC3,等等。一个一般的OpenCV结构体能够被存储到一个单独的实例中,例如一个原始数据类型Vec。多个实例可以被存储在std::vector、Mat、Mat_、SparseMat、OparseMat_或其他可以保存Vec实例的容器中。
    DataType类主要用来为原始数据类型提供描述,同时它不会给对应的类加入子段和方法(实际上不可能修改C/C++的原始数据类型)。这个技术依赖于C++的类特性。DataType本身并不会被使用,但是他的特殊版本会被使用。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值