学习opencv第三章 基本数据类型 ,矩阵创建,操作,访问

  • 下面的类型可忘文生义

CvPoint     

CvSize

CvRect

CvScalar   // scalar翻译为 标量

typedef struct CvScalar
{
    double val[4];
}
CvScalar; //故CvScalar正好可以存在一个颜色空间的值如:RGBA颜色空间

这四种类型C语言版中都为结构体,成员为整型  (具体的可以进入其头文件查看)

在后面加上2D32f  , 2D64f, 3D32f , 3D64f就变成了成员为float或者double型的

产生这4种类型的函数为  (后面可以加上2D32f等:

cvPoint

cvSize

cvRect

cvScalar

特点:

若Cv ,则为数据类型

若cv,则为产生对应数据类型的函数


  • 矩阵和图像类型
opencv 2.0+ 的版本 可分为C语言版和C++版  ,C++版的类型都被封装成了类 ,(头文件为.hpp, 定义在cv的名字空间下,使用using namespace cv后,函数和类都不需要加Cv , 如类为cv::Mat)   .

C语言版的类型都为结构体,对应头文件为(*.h) , 所以的函数和类型前缀都为Cv或者cv或者CV

CvArr 不为类型 

查看头文件发现: #typedef void CvArr   ,有很多函数传入此类型的指针即void *,,,      :一般需要传入CvArr* 的地方都可以用CvMat*或者IplImage*指针传入

CvMat矩阵,图像类型

IplImage 存储图像的类型

存储类型有:

CV_

RGBA 颜色空间,  RGB表示红绿蓝  ,  A为alpha通道,表示不透明度

CvMat 相应的函数:

CVAPI(CvMat*) cvCreateMat( int rows, int cols, int type );//创建CvMat结构体及其分配指向的数据

CVAPI(CvMat*) cvCreateMatHeader( int rows, int cols, int type );//只产生CvMat结构体

CVAPI(void) cvCreateData( CvArr* arr );  //为CvMat分配数据空间

CVAPI(CvMat*) cvCloneMat( const CvMat* mat )  //完全克隆CvMat,包括data

CVAPI(CvMat*) cvInitMatHeader( CvMat* mat, int rows, int cols, int type, void* data CV_DEFAULT(NULL), int step CV_DEFAULT(CV_AUTOSTEP) );//初始化已存在的CvMat类型

CVAPI(void) cvReleaseMat( CvMat** mat );

CVAPI(int) cvGetElemType( const CvArr* arr )

CVAPI(int) cvGetDims( const CvArr* arr, int* sizes CV_DEFAULT(NULL) );

CVAPI(int) cvGetDimSize( const CvArr* arr, int index )



  • CvMat数据读取:
1. 使用宏(简单的方法):

CV_MAT_ELEM     //CV_MAT_ELEM( mat, elemtype, row, col )返回elemtype型的值,只能读

CV_MAT_ELEM_PTR  //返回void *指针,使用时得自己强制转化成对应的类型

#define CV_MAT_ELEM( mat, elemtype, row, col ) (*(elemtype*)CV_MAT_ELEM_PTR_FAST( mat, row, col, sizeof(elemtype)))

#define CV_MAT_ELEM_PTR( mat, row, col ) CV_MAT_ELEM_PTR_FAST( mat, row, col, CV_ELEM_SIZE((mat).type) )


2.麻烦的方法(用函数获取值或者指针)

CVAPI(double) cvGetReal1D( const CvArr* arr, int idx0 ) //一维

CVAPI(double) cvGetReal2D( const CvArr* arr, int idx0, int idx1 )  //二维

CVAPI(double) cvGetReal3D( const CvArr* arr, int idx0, int idx1, int idx2 )

CVAPI(double) cvGetRealND( const CvArr* arr, const int* idx )

CVAPI(CvScalar) cvGet1D( const CvArr* arr, int idx0 )

CVAPI(CvScalar) cvGet2D( const CvArr* arr, int idx0, int idx1 )

CVAPI(CvScalar) cvGet3D( const CvArr* arr, int idx0, int idx1, int idx2 )

CVAPI(CvScalar) cvGetND( const CvArr* arr, const int* idx )

这是获取矩阵值的方法 .

其中 带有Real只能用在单通道矩阵中!

不带Real的可以用在任意通道数的矩阵中 ,  返回的值为一个CvScalar

若为单通道,则CvScalar里面存放的4个double中,只第一个有用。若矩阵为RGB图像,则获取的(row,col)处的值RGB正好对应CvScalar前三个double成员

因为如对于RGB颜色空间图像数据的存储是交错存放的即:RGBRGBRGBRGB...

获取元素指针的方法:

CVAPI(uchar*) cvPtr1D( const CvArr* arr, int idx0, int* type CV_DEFAULT(NULL))

CVAPI(uchar*) cvPtr2D( const CvArr* arr, int idx0, int idx1, int* type CV_DEFAULT(NULL) )

CVAPI(uchar*) cvPtr3D( const CvArr* arr, int idx0, int idx1, int idx2, int* type CV_DEFAULT(NULL))

这三个函数得到的是uchar* 型的指针,即unsigned char *指针,使用时还得强制转化成相应的指针,如double * ,  float * , int *等


相应的还有读和存的函数:

CVAPI(void) cvSetReal1D( CvArr* arr, int idx0, double value )  //对单通道

...2D  ...3D ..4D ..ND

CVAPI(void) cvSet1D( CvArr* arr, int idx0, CvScalar value )    //对多通道

..2D ..  3D .. 4D 

对于浮点型单通道有专用的函数访问  (即类型为CV_64FC1的):

CV_INLINE double cvmGet( const CvMat* mat, int row, int col )

CV_INLINE void cvmSet( CvMat* mat, int row, int col, double value )


  • 恰当的方法(直接用指针操作)

做图像处理都是运算密集型,用上述函数访问的方法会比较慢了  ,, 

CvMat和IplImage类型中都有个step成员 , step 成员指一行的字节数

你可能感兴趣的:(struct,null,存储,语言,float,图像处理)