opencv设计了一些基础的数据类型和一些帮助的数据类型
基础数据类型 :
图像类 IplImage;
矩阵类 CvMat;
可变集合类:CvSeq CvSet CvGraph;
多维柱状图混合类:CvHistogram;
帮助数据类型:
二维点坐标 CvPoint;
图像高和宽的 CvSize;
迭代过程结束条件得 CvTernCriteria;
表示图像转换内核的 IplConKernel;
表示空间力矩的CvMonment;
LoadImage()图像载入函数
IplImage* cvloadImage(cosnt char* filename,int iscolor);
filename 目标图片名车包括拓展名,
iscolor 可选值有 0. 1 -1;整数表示彩色图像,0表示输出灰度图像,负数表示在入通道数由图片本身决定;
NamedWindows()串口定义函数
int cvNamedWindows(cosnt char*name,unsigned long falgs);
name 窗口名称
falgs 1:窗口尺寸和图片相同
0:一固定的尺寸显示窗口窗口名字可以被调用,已有的窗口名字重复定义不起作用
cvShowImage();在指定窗口显示图片;
void cvShowImage(cosnt char*name,const CvArr*image)
name 窗口名字
image 图像指针;
WaitKey();按键等待函数
int cvWaitKey(int delay)
delay 等待毫秒数若 delay<=0;无限等待
SaveImage()图像保存函数;
int cvSaveImage(cosnt char* filename,const CvArr*image);
filename:保存路径和名称;
image 保存的图片指针IplImage;
DestoryWindow()窗口销毁函数
void cvDestoryWindow(cosnt char*name)
name:要销毁的窗口名称;
ReleaseImage();
void cvReleaseImage(IplImage**image);
image 销毁变量内存空间值不会销毁原图片
不难看出OPencv的命名规则 在函数前加cv 其实在函数前加icv的是内部函数内部宏ICV做前缀
opencv参数大概约定
对于简单的过程函数典型的顺序:输入参数 输出参数 标记或可选参数输入参数常用const修饰
对于容器元素方法:容器元素位置标记或可选参数
CV_DEFAULT是允许参数默认值的宏
OpenCV 基本数据结构
点:
CvPoint 二维整形坐标轴上的点
CvPoint2D32f 二维浮点型坐标轴上的点
CvPoint3D32f 三维浮点型坐标轴上的点
矩形框:
CvSize 矩形框大小 整形
CvSize2D32f 矩形框大小 浮点型
CvRect 矩形框的偏移和大小
可存放1-TUPLE 2-TUPLE 3-TUPLE 4-TUPLE类型的捆绑数据容器
CvScalar
该函数包含4个浮点成员,可以用来表示B(Blue),G(Green),R(Red),Alpha(表示图像的透明度)
可以储存图像信息的定义数组
多信道矩阵
CvMat
/*
*CvMat矩阵头
*/
typedef struct CvMat
{
int type; //数据类型,比如CV_32FC1含义是32位浮点型单通道,再比如CV_8UC3含义是8位无符号整型三通道
int step; //每行数据的字节数:元素个数*元素类型的字节长度
int* refcount;/* for internal use only */
int hdr_refcount;
union
{
uchar* ptr; //指向data数据的第一个元素
short* s;
int* i;
float* fl;
double* db;
} data; //共同体data,里面成员公用一个空间,也就是说数据类型可以有这五种。
union
{
int rows; //像素的行数
int height; //图片的高度
};
union
{
int cols; //像素的列数
int width; //图片的宽度
};
} CvMat;
图形结构
IplImage
定义图像的数组,很复杂
typedef struct _IplImage
{
int nSize; /* IPlImage大小 */
int ID; /* 版本 (=0)*/
int nChannels; /* 大多数OpenCV支持1234 个信道 */
int alphaChannel; /* 这一项定义被忽略 OpenCV */
int depth; /* 像素深度: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S,
IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F 都支持. */
char colorModel[4]; /* Ignored by OpenCV */
char channelSeq[4]; /* 同上被忽略 */
int dataOrder; /* 0 - 交叉存取颜色信道, 1 - 分开颜色信道.
cvCreateImage 只有这个函数可以创建交叉存储图像 */
int origin; /* 0 - 顶-左结构,
1 - bottom-left windows风格. */
int align; /*图像行排列4.8两种排列不过OpenCV忽略他用widthstep代替 */
int width; /* 图像宽度像素 */
int height; /* 图像高像素数. */
struct _IplROI *roi; /*图像感兴趣区域,当该值非空时只对这个区域处理=*/
struct _IplImage *maskROI; /* Must be NULL. */ 必须置NULL
void *imageId; /* " " */
struct _IplTileInfo *tileInfo; /* " " */
int imageSize; /* 图像数据大小
(==image->height*image->widthStep
在交叉存储下),单位是字节*/
char *imageData; /* 指向排列的图像数据. */
int widthStep; /* S排列图像行大小字节为单位. */
int BorderMode[4]; /* Ignored by OpenCV. */
int BorderConst[4]; /* Ditto. */
char *imageDataOrigin; /* 指针指向一个不同的图像数据结构不是必须排列的是为了纠正图像内存分配 */
} IplImage;
CvMat矩阵
常用到操作矩阵的函数:
CvMat* cvCreateMat(int row ,int col,int type);
创建一个新矩阵为矩阵分配头和数据,上面分别是行 列 类型返回矩阵指针
CvMat* cvCreateMatHeader(int row ,int col,int type)
创建一个新矩阵头但没有数据
CvMat* cvInitMatHeader(CvMat* mat ,int row,int col,int type,void
*data=NULL,int,step=CV_AUTOSTEP)
初始化原始数据 data是分配给头文件的指针
CvMat* cvCMat(int row,int col,int type,void*data=NULL)
快速内联函数 初始化的作用
CvMat* cvcloneMat(const CvMat* mat )
创建矩阵复制
void cvReleaseMat(CvMat**mat)
删除矩阵
还有很多关于数组计算线性代数我都不一一列举了参考手册上都有提到
还有一个动态数据结构
OpenCV中以内部储存器(CvMemStorage)为底层实现 序列(CvSeq) 集合(CvSet) 图(CvGraph)和树这些数据结构
创建内存块 CvMemstorage *cvCreateMemStroge(int block_size=0)
创建一块内存块并返回指向块首地址的指针
删除内存块 void cvReleaseMEMStorage* *storage)
删除所有的内存块或返回他们的父类接下来在释放首地址
序列是OpenCV中动态数组的基础 CvSeq:两个序列稠密序列和稀疏序列
集合是由CvSet继承来的再次基础上增加了free_elems域,这是一个由空节点组成的列表,如果节点为空flag为负,如果被占用 flag为正数此时flag包含索引值使用表达式set——elem->flag&CV_SET_ELEM_IDX_MASKH;
还有最后一个函数
图CVGraph若用到在看这些数据结构吧,数据结构是我最头疼了在这里总结一下,用到在学习