[opencv]有关矩阵以及iplimage

来源:互联网 发布:7k7k皮卡堂盗号软件 编辑:程序博客网 时间:2024/06/08 10:10

访问双通道的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个表示通道的值。进而再加几,就是这个元素的第几个通道的值。