作者:gnuhpc
出處:http://www.cnblogs.com/gnuhpc/
我們需要了解一個多維數組(矩陣)和一個一維,但是包含高維數據的數組之間的區別。假設,你有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