opencv中矩阵数据的存取

来源:互联网 发布:商业化软件验收 编辑:程序博客网 时间:2024/06/07 19:15

一、最简单的方法——利用宏

两种宏:

(1)CV_MAT_ELEM()

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


(2)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;

一共三个参数,第一个参数是传入的矩阵,第二个参数是待返回元素的行,最后一个是列。

二、麻烦的方法

此方法是用cvmat和iplimage的一些元素函数,

!!!矩阵当中的step元素

它是矩阵中,行的长度,单位为字节。矩阵或图像中的内存分配通常是4个字节的整数倍。所以,若有三个字节宽度的矩阵,则此矩阵将被分配4个字节,最后一个字节被忽略。

例如:若我们有一个整型或者浮点型的矩阵,对应的有整形和浮点型的指针指向数据区域,要想移到下一行,则将指针加上step/4,而对于双精度的,要加上step/8


三、恰当的方法

有二中关于“step”的知识,可以得到下面计算“三通道矩阵中所有元素之和”的代码

float sum(const CvMat* img){float s = 0;for (int row = 0; row <= img->rows; row++){const float* ptr = (const float*)(img->data.ptr + row*img->step);//data.ptr是第一个元素的指针,此句为了转到每一行第一个元素的指针for (int col = 0; col <= img->cols; col++)s = *ptr++;}return s;}



原创粉丝点击