cvArr
cvMat 创建 五种方式,只分配具体空间,并没有付具体的值。
1, CvMat* cvCreateMat(int rows,int cols,int type);(分配内存,没有数据,包括文件头和文件体)
只创建文件头,不分配数据区的内存
2,CvMat* cvCreateMatHeader(int rows,int cols,int type);
3, CvMat* cvInitMatHeader(
cvMat* mat,
int rows,
int cols,
int type,
void* data = NULL,
int step = CV_AUTOSTEP)
4,构造函数 CvMat cvMat()
5,复制函数 CvMat* cvCloneMat()
矩阵赋值
loat vals[] = {};
CvMat mat;
CvMat* cvInitMatHeader(&mat,2,2,CV_32FC1,vals);
矩阵访问:
常用方式:
for(y=0;y<mat_1Chanel.rows;y++)
{
float* pp_float = (float*)(mat_1Chanel.data.ptr + y*mat_1Chanel.step);
for(x=0;x<mat_1Chanel.cols;x++)
{
float ptr = *pp_float++ ;
printf("%f",ptr);
}
}
另有函数
cvPtrND;cvGetND;cvGetRealDN;cvSetND;cvSetRealND;cvmGet;cvmSet;
图像创建,赋值与矩阵相似
图像的访问:
IplImage img = cvCreateImage(cvSize(30,60),8,1);
for(int y =0, y<img->height,y++)
{
uchar* ptr = (uchar*)(img->imageData + y*img->widthStep);
}
for(int x = 0,x<img->width,x++)
{
ptr[3*x + 1] = 255;
ptr[3*x + 2] = 255;
}
注意几个难点:
1, 图像的维度和通道的计算;
2,cvScalar在多通道中的使用;
3,图像的widthstep的使用
4,偏移量的计算memset(包括字节和通道)