文章目錄
訪問雙通道的Mat類型的方法
float data[18] = {30,60,40,60,50,40,67,88,55,33,22,97,59,69,32,46,25,45,};CvMat mat;cvInitMatHeader(&mat,3,3,CV_32FC2,data);//double have3*3 elementsint nChannels = 2;for(y = 0;y<mat.rows;y++){float *da = (float*)(mat.data.ptr + y*mat.step);//指標指向某一行的第一個元素for(x = 0;x<mat.cols;x++){float value[2];value[0] = *(da+x*nChannels);//由於每個元素包括nChannels個值 這裡需要加幾個可以找到第某個通道的值value[1] = *(da+x*nChannels+1);printf("(%f %f)",value[0],value[1]);}printf("\n");}
float *da = (float*)(mat.data.ptr + y*mat.step);//指標指向某一行的第一個元素
這句話如注釋所說,先找到某一行,mat.data.ptr這個是矩陣最頭的元素,他的類型是unsignedchar型指標,mat.step是兩行mat之間的距離,加一個這個就可以跳一行的。但要注意的是,mat.data.ptr是一個位元組的無符號整型數,每加1就會移動一個位元組數。
如果變成(float*)(mat.data.ptr) + y*mat.step;就不對了,先變成了float型的指標,再加一個數字就移動了一個float大小的4位元組,移多了……
value[0] = *(da+x*nChannels)這句話,da已經移到某一行的頭,然後移到第x個元素需要加x*nChannels,因為每個元素有nChannels個表示通道的值。進而再加幾,就是這個元素的第幾個通道的值。