基本数据类型
OpenCV有很多基本数据类型,其中比较基本的有四种,
CvPoint,是一个包含integer成员x和y的简单结构体,有两种变体类型CvPoint2D32f和CvPoint3D32f.
CvSize,是一个包含integer成员width和height的简单结构体,如果希望使用浮点类型,可以选用其变体类型CvSize2D32f.
CvRect类型派生于CvPoint和CvSize,包含4个数据成员,x,y,width和height.
CvScalar是包含4个integer成员的类型,CvScalar有一个单独的成员val,是一个指向4个双精度浮点数的数组指针.
所有以上数据类型的构造函数都有与结构类型一样的名称,其结构如下表
结构体 | 成员 | 说明 |
---|---|---|
CvPoint | int x, y | 图像中的点 |
CvPoint2D32f | float x, y | 二维空间中的点 |
CvPoint3D32f | float x, y, z | 三维空间中的点 |
CvSize | int width, height | 图像的尺寸 |
CvRect | int x, y, width, height | 图像的部分尺寸 |
CvScalar | double val[4] | RGBA值 |
矩阵和图像类型
下图中展示的是三种图像的类和层次结构,在使用OpenCV时,会经常用到IplImage的数据类型,是通常所说的对图像进行编码的基本结构,可能是灰度,彩色,4通道(RGBA)的,其中每个通道可以包含任意的整数或浮点数,因此,该类型比常见的RGB图像更通用。
可以看到CvMat由CvArr派生,而又通过CvMat派生出IpImage。在函数原型种,如果看到CvArr*,便可以将CvMat*或IplImage*传递到程序内部。
在多通道的矩阵中,通道是连续的,例如,在一个3通道2维的表示红,绿,蓝矩阵种,矩阵数据如下存储rgbrgbrgb...所以要将该数据类型的指针移动到下一通道,只需要将其增加1,如果需要访问下一个元素集,只需要增加一定的偏移量,使之与通道数相等。
IplImage数据结构
typedef struct _IplImage {
int nSize;
int ID;
int nChannels;
int alphaChannels;
int depth;
char colorModel[4];
char channelSeq[4];
int dataOrder;
int origin;
int align;
int width;
int height;
struct _IplROI* roi;
struct _IplImage* maskROI;
void* imageId;
struct _IplTileInfo* titleInfo;
int imageSize;
char* imageData;
int widthStep;
int BorderMode[4];
int BorderConst[4];
char* imageDataOrigin;
}IplImage;
OpenCV数据类型
宏 | 图像像素类型 |
---|---|
IPL_DEPTH_8U | 无符号8位整数(8u) |
IPL_DEPTH_8S | 有符号8位整数(8s) |
IPL_DEPTH_16S | 有符号8位整数(16s) |
IPL_DEPTH_32S | 有符号8位整数(32s) |
IPL_DEPTH_32F | 32位浮点数单精度(32f) |
IPL_DEPTH_64F | 64位浮点数单精度(64f) |
矩阵和图像操作
函数名称 | 描述 |
cvAbs | 计算数组中所有元素的绝对值 |
cvAbsDiff | 计算两个数组差值的绝对值 |
cvAbsDiffs | 计算数组和标量差值的绝对值 |
cvAdd | 两个数组元素级的加运算 |
cvAdds | 一个数组和一个标量元素级的相加运算 |
cvAddWeighted | 两个数组的元素级的加权相加运算(alpha融合) |
cvAvg | 计算数组中所有元素的平均值 |
cvAvgSdv | 计算数组中所有元素的绝对值和标准差 |
cvCalcCovarMartix | 计算一组n维空间向量的协方差 |
cvCmp | 对两个数组中的所有元素运用设置的比较操作 |
cvCmpS | 对数组和标量运用设置的比较操作 |
cvConvertScale | 用可选的缩放值转换数组元素类型 |
cvConvertScaleAbs | 计算可选的缩放值的绝对值之后再转换数组元素的类型 |
cvCopy | 把数组中的值复制到另一个数组中 |
cvCountNonZero | 计算数组中非0值的个数 |
cvCrossProduct | 计算两个三维向量的向量积(叉积) |
cvCvtColor | 将数组的通道从一个颜色空间转换另一个颜色空间 |
cvDotProduct | 计算两个向量的点积 |
cvEigenVV | 计算方阵的特征值和特征向量 |
cvFlip | 围绕选定轴旋转 |
cvGEMM | 矩阵乘法 |
cvGetCol | 从一个数组的列中复制元素 |
cvGetCols | 从数据的相邻的多列中复制元素值 |
cvGetDiag | 复制数组中对角线上的所有元素 |
cvGetDims | 返回数组的维度 |
cvGetDimSize | 返回一个数组的所有维大小 |
cvGetRow | 从一个数组的行中复制元素值 |
cvGetRows | 从一个数组的多个相邻的行中复制元素值 |
cvGetSize | 得到二维的数组的尺寸,以CvSize返回 |
cvGetSubSize | 从一个数组的子区域复制元素值 |
cvInRange | 检查一个数组的元素是否在另外两个数组中的值的范围内 |
cvInRangeS | 检查一个数组的元素是否在另外两个标量的范围内 |
cvInvert | 求矩阵的转置 |
cvMahalonobis | 计算两个向量间的马氏距离 |
cvMax | 在两个数组中进行元素级的取最大值操作 |
cvMaxS | 在一个数组和一个标量中进行元素级的取最大值操作 |
cvMerge | 把几个单通道图像合并为一个多通道图像 |
cvMin | 在两个数组中进行元素级的取最小值操作 |
cvMinS | 在一个数组和一个标量中进行元素级的取最小值操作 |
cvMinMaxLoc | 寻找数组中的最大最小值 |
cvMul | 计算两个数组的元素级的乘积 |
cvNot | 按位对数组中的每一个元素求反 |
cvNorm | 计算两个数组的正态相关性 |
cvNormalize | 将数组中的元素进行归一化 |
cvOr | 对两个数组进行按位或操作 |
cvOrS | 在数组和标量之间进行按位或操作 |
cvReduce | 通过给定的操作符将二维数组约简为向量 |
cvRepeat | 以平铺的方式进行数组复制 |
cvSet | 用给定值初始化数组 |
cvSetZero | 将数组中的所有元素初始化为0 |
cvSetIdentity | 将数组中对角线上的元素设为1,其他置0 |
cvSolve | 求出线性方程组的解 |
cvSplit | 将多通道所组分割成多个单通道数组 |
cvSub | 两个数组元素级的相减 |
cvSubS | 元素级的从数组减去标量 |
cvSubRS | 元素级的从标量中减去数组 |
cvSum | 对数组中的所有元素求和 |
cvSVD | 二维矩阵的奇异值分解 |
cvSVBkSb | 奇异值回代计算 |
cvTrace | 计算矩阵迹 |
cvTranspose | 矩阵的转置运算 |
cvXor | 对两个数组进行按位异或操作 |
cvXorS | 在数组和标量之间进行按位异或操作 |
cvZero | 将所有数组中的元素置为0 |
在这里推荐一下OpenCV的官方手册网站,可以根据自己的OpenCV环境进行下载使用:
本文参考《学习OpenCV》等资料进行完善、更正,如有侵权,请联系作者删除、更改。
欢迎评论文章,给予宝贵建议,请关注作者,共同学习交流。