OpenCV:widthStep vs step( 四 )


iplImage = cvCreateImageHeader(cvSize(width,height),depth,channels);
cvSetData(iplImage,data,step);
起首 , 由cvCreateImageHeader()建立IplImage图像头 , 设置图像尺寸、深度和通道数;
然后 , 由cvSetData()按照BYTE*图像数据指针设置IplImage图像头的数据 , 
此中 , step指定该IplImage图像 , 每行占的字节数 , 对于1通道的 IPL_DEPTH_8U图像 , step可以等于width 。

OpenCV:widthStep vs step

文章插图

6Mat拜候图像像素---step:
data:unsigned char类型的指针 , 指标的目的Mat数据矩阵的首地址;
dims:Mat矩阵的维度;
rows:Mat矩阵的行数;
cols:Mat矩阵的列数;
size():是一个布局体 , 有image.size().width==image.cols; image.size().height==image.rows
channels():Mat矩阵元素拥有的通道数;
depth:怀抱每一个像素中每一个通道的精度 , 但它自己与图像的通道数无关!depth数值越年夜 , 精度越高 。 在Opencv中 , Mat.depth()获得的是一个0~6的数字 , 别离代表分歧的位数 , 如下:{CV_8U=0,CV_8S=1,CV_16U=2,CV_16S=3,CV_32S=4,CV_32F=5,CV_64F=6}
elemSize:暗示矩阵中每一个元素的数据大小 , 单元字节 , 若是Mat中的数据类型是CV_8UC1 , 那么elemSize==1;若是是CV_8UC3或CV_8SC3 , 那么elemSize==3;若是是CV_16UC3或者CV_16SC3 , 那么elemSize==6;即elemSize是以8位(一个字节)为一个单元 , 乘以通道数和8位的整数倍;
elemSize1:
暗示Mat矩阵中每一个元素单个通道的数据大小 , 单元字节 , elemSize1=elemSize/channels;
step:为Mat矩阵中每一行的“步长” , 以字节为根基单元 , 每一行中所有元素的字节总量;
step1():以字节为根基单元 , Mat矩阵中每一个像素的大小step1==step/elemSize1;
type:Mat矩阵的类型 , 包含有矩阵中元素的类型、通道数信息 , type的定名格局为CV_(位数)+(数据类型)+(通道数) , 如下:

OpenCV:widthStep vs step

文章插图

7Mat拜候图像像素---step
step:为Mat矩阵中每一行的“步长” , 以字节为根基单元 , 每一行中所有元素的字节总量;
经常应用在拜候图像像素操作中;如下:
对8bit , 单通道 , unsigned char类型的图像I---Mat img:
unsigned char* pData=https://vvvtt.com/article/(unsigned char*)img.data;
I(x, y)~pData[img.step*y+x];//
对8bit , 3通道 , unsigned char类型的图像I---IplImage* img:
I(x, y)blue~((unsigned char*)(img.data+img.step*y))[x*3];
I(x, y)green~((unsigned char*)(img.data+img.step*y))[x*3+1];
I(x, y)red~((unsigned char*)(img.data+img.step*y))[x*3+2];
对32bit , 1通道 , float*类型的图像I---Mat img:
I(x, y)~((float*)(img.data+img.step*y)[x];
对32bit , 3通道 , float*类型的图像I--- Mat img;
I(x, y) blue ~((float*)(img.data+img.step*y))[3*x];
I(x, y) green ~((float*)(img.data+img.step*y))[x*3+1];
I(x, y) red ~((float*)(img.data+img.step*y) )[x*3+2];
对64bit , 1通道 , double*类型的图像I---Mat img:
I(x, y)~((double*)(img.data+img.step*y)[x];

推荐阅读