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

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

2015-05-25 09:04 260 查看
今天学习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本身并不会被使用,但是他的特殊版本会被使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐