opencv多通道数据和莫莫多维材质通道转换设置数据的区别

opencv Mat 多通道 数据读取或赋值
Mat n = Mat::zeros( 2, 3, CV_32FC3 );
n.at&Vec3f&(i,j)[0] = 1;
n.at&Vec3f&(i,j)[1] = 2;
n.at&Vec3f&(i,j)[2] = 3;
没有更多推荐了,多维对象的元素矩阵在内存中的分布、opencv
编辑:www.fx114.net
本篇文章主要介绍了"多维对象的元素矩阵在内存中的分布、opencv",主要涉及到多维对象的元素矩阵在内存中的分布、opencv方面的内容,对于多维对象的元素矩阵在内存中的分布、opencv感兴趣的同学可以参考一下。
&&& 为了高效的获取矩阵形式存在的多维对象中的元素,就需要知道其在内存中是如何分布的。
&&& 注意:矩阵格式的不同,其在内存中的分布方式也就不同。
&&& 例如,使用矩阵存储n个三维点,有如下四种可能的方式:
&&& 1、n 行 1 列,3 通道;
&&& 2、1 行 n 列,3 通道;
&&& 3、n 行 3 列,1 通道;
&&& 4、3 行 n 列,1 通道;
&&& 如下图所示:
&&& 基于如下两个原则,前三种矩阵样式在内存中是按照如下方式存储的:
&&& 原则1:元素是以从左向右,从上到下的方式存储的;
&&& 原则2:各个通道之间是交错存储的;
&&& 对于n 行 1 列,3 通道的情形,第一个三元组(x, y, z)&属于第一行的元素,各个通道是交错存储的。
&&& 1 行 n 列,3 通道的情形与此相同,第一个三元组(x, y, z)&属于第一列的元素,各个通道是交错存储的。
&&& n 行 3 列,1 通道的情形与此相同,但是没有了通道的概念,仅仅按照从上到下的顺序即可获得各个三元组数据。
&&& 对于3 行 n 列,1 通道的情形,则同上述情形不同,其在内存中的分布方式如下:
&&& 这种情形下没有了通道的概念,从左至右,从上到下的遍历矩阵的元素即可。
&&&&为了正确的获得矩阵中的元素,下面的公式可以用来计算通用的偏移量:
&&& offset = (row * numCols * numChannels) + (col * numChannels) + (channel)
&&& 这里,row,&col&和&channel分别表示想要获取的元素对应的行号、列号和通道编号。
&&& numCols&和 numChannels表示矩阵的列数和通道数。
&&& 转自:
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:opencv中的多通道矩阵CvMat元素的访问
CvMat* mat;
mat = cvCreateMat(9,10,CV_64FC3);//注意所申请矩阵元素的类型,不同的类型访问操作方法不同,但类似可推导,以此为例。
opencv中的多通道矩阵CvMat元素的访问方法总结如下:
mat(i,j,1):
*(mat-&data.db + i*(mat-&step/8) + 3*j);//.db为double数据类型,step类型为int,代表矩阵每行的字节数,因此要处以sizeof(double)
mat(i,j,2):
*(mat-&data.db + i*(mat-&step/8) + 3*j+1);
mat(i,j,3):
*(mat-&data.db + i*(mat-&step/8) + 3*j+2);
mat(i,j,1):
((double*)(mat-&data.ptr+i*mat-&step))[3*j];//ptr的类型为uchar*,step类型为int,代表矩阵每行的字节数。另外指针可以当做数组名,因此可以这样操作。
mat(i,j,2):
((double*)(mat-&data.ptr+i*mat-&step))[3*j+1];
mat(i,j,3):
((double*)(mat-&data.ptr+i*mat-&step))[3*j+2];
mat(i,j,1):
*( (double*)(mat-&data.ptr+i*mat-&step) + 3*j );//根据以上也可以这样
总之就是C语言中的指针操作啦,要注意指针的类型,以及step的单位是字节就可以了。
没有更多推荐了,千里之行,始于足下
keep hungry, keep foolish. We are all together.
Opencv-多维数组内存分配
我们需要了解一个多维数组(矩阵)和一个一维,但是包含高维数据的数组之间的区别。假设,你有n个点(每个点有x,y,z坐标值)需要保存到CvMat* 中,你其实有四种方式可以使用,但这四种方式的存储形式不同。你可能使用一个二维矩阵,矩阵大小为n行3列,数据类型为CV32FC1。你还可以使用一个二维矩阵,矩阵大小为3行n列,数据类型为CV32FC1;第三种可能性是,你使用一个一维矩阵,n行1列,数据类型为CV32FC3;最后,你还可以使用1行三列,数据类型为CV32FC3.这几种方式,在内存分配上,有些是相同的,有些是不同的,如下所示:
n个点的集合(n=5);(x0 y0 z0) (x1 y1 z1) (x2 y2 z2) (x3 y3 z3) (x4 y4 z4)
n行1列时(数据类型CV32FC3)内存分配情况x0 y0 z0 x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4
1行n列时(数据类型CV32FC3)内存分配情况x0 y0 z0 x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4
n行3列时(数据类型CV32FC1)内存分配情况x0 y0 z0 x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4
3行n列时(数据类型CV32FC1)内存分配情况x0 x1 x2 x3 x4 y0 y1 y2 y3 y4 z0 z1 z2 z3 z4
我们可以看出,前三种的内存分配情况相同,但最后一种的内存分配不同。更复杂的是,如果有n维数组,每个数组的元素是c维(c可能是通道数)时。所以,多维数组(矩阵)和一个一维但包含多维数据的数组一般是不同的。
对于一个Rows行Cols列,通道数为Channels的矩阵,访问其中第row行,第col列,第channel通道的数据,可以使用如下公式:数据地址偏移量=row*Cols*Channels+col*Channels+channel
本文来自CSDN博客,转载请标明出处:
没有更多推荐了,OpenCV学习——一个多维数组(矩阵)和一个一维,但是包含高维数据的数组之间的区别
OpenCV学习——一个多维数组(矩阵)和一个一维,但是包含高维数据的数组之间的区别
我们需要了解一个多维数组(矩阵)和一个一维,但是包含高维数据的数组之间的区别。假设,你有n个点(每个点有x,y,z坐标值)需要保存到CvMat*
中,你其实有四种方式可以使用,但这四种方式的存储形式不同。你可能使用一个二维矩阵,矩阵大小为n行3列,数据类型为CV32FC1。你还可以使用一个
二维矩阵,矩阵大小为3行n列,数据类型为CV32FC1;第三种可能性是,你使用一个一维矩阵,n行1列,数据类型为CV32FC3;最后,你还可以使
用1行三列,数据类型为CV32FC3.这几种方式,在内存分配上,有些是相同的,有些是不同的,如下所示:
n个点的集合(n=5);
(x0 y0 z0) (x1 y1 z1) (x2 y2 z2) (x3 y3 z3) (x4 y4 z4)
n行1列时(数据类型CV32FC3)内存分配情况
x0 y0 z0 x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4
1行n列时(数据类型CV32FC3)内存分配情况
x0 y0 z0 x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4
n行3列时(数据类型CV32FC1)内存分配情况
x0 y0 z0 x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4
3行n列时(数据类型CV32FC1)内存分配情况
x0 x1 x2 x3 x4 y0 y1 y2 y3 y4 z0 z1 z2 z3 z4
我们可以看出,前三种的内存分配情况相同,但最后一种的内存分配不同。更复杂的是,如果有n维数组,每个数组的元素是c维(c可能是通道数)时。所以,多维数组(矩阵)和一个一维但包含多维数据的数组一般是不同的。
对于一个Rows行Cols列,通道数为Channels的矩阵,访问其中第row行,第col列,第channel通道的数据,可以使用如下公式:
数据地址偏移量=row*Cols*Channels+col*Channels+channel}

我要回帖

更多关于 opencv 4通道转3通道 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信