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

本文深入探讨了OpenCV中CvPoint、CvSize、CvRect、CvScalar的基本概念和用途,解释了它们在C语言和C++版本中的区别,并提供了如何在图像处理任务中高效使用这些数据类型的指导。同时,介绍了矩阵和图像类型,如CvMat、IplImage,以及如何进行数据读取和存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 下面的类型可忘文生义

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 成员指一行的字节数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值