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,则为产生对应数据类型的函数
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 )
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 成员指一行的字节数