第3章 初探OpenCV

OpenCV的基本数据类型

  • 基本数据类型
结构 成员 意义
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值

CvMat矩阵结构

在OpenCV中没有向量(vector)结构,需要时可以用列矩阵代替。
矩阵由宽度(width),高度(height),类型(type),行数据长度(step)和一个指向数据的指针构成。

  • 矩阵头的定义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
typeded struct CvMat {
int type;
int step;
int* refcount;
union {
unchar* ptr;
short* s;
int* i;
float* fl;
double* db;
}data;
union {
int rows;
int height;
};
union {
int cols;
int width;
};
} CvMat;
  • 矩阵的创建与释放
1
2
3
4
5
CvMat* cvCreateMat(int rows, int cols, int type); 
CvMat* cvCreateMatHeader(int rows, int cols, int type); //只创建CvMat结构,不分配存储空间
CvMat* cvInitMatHeader(CvMat* mat, int rows, int cols, int type, void* data=NULL, int step=CV_AUTOSTEP); //在已存在的结构上初始化CvMat矩阵头
CvMat* cvCloneMat(const CvMat* mat); // 克隆
void cvReleaseMat(CvMat** mat); // 释放
  • 矩阵数据的存取
1
2
3
4
5
6
7
float element_3_2 = CV_MAT_ELEM(*mat, float, 3, 2);
uchar* cvPtr2D(const CvArr* arr, int idx0, int idx1, int* type=NULL); // 返回指向所需元素的指针
double cvGetReal2D(const CvArr* arr, int indx0, int idx1); // 返回矩阵元素的实际值
CvScalar cvGet2D(const CvArr* arr, int idx0, int idx1); // 返回CvScalar类型

void cvSetReal2D(CvArr* arr, int idx0, int idx1, double value); // 设置值
void cvSet2D(CvArr* arr, int idx0, int idx1, CvScalar value);

IplImage数据结构

  • IplImage结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
typedef struct _IplImage {
int nSize;
int ID;
int nChannels;
int alphaChannel;
int depth;
char colorModel[4];
char dataOrder;
int origin;
int align;
int width;
int height;
struct _IplROI *roi;
struct _IplImage *maskROI;
void *imageId;
struct _IplTileInfo *tileInfo;
int imageSize;
char *imageData;
int widthStep;
int BorderMode[4];
int BorderConst[4];
char *imageDataOrigin;
} IplImage;
  • ROI的设置与重置
1
2
void cvSetImageROI(IplImage* image, CvRect rect); // 设置ROI
void cvResetImageROI(IplImage* image); // 取消ROI

画图

  • 直线
1
2
void cvLine(CvArr* array, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1, int connectivity=8); // 直线
void cvRectangle(CvArr* array, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1); // 矩形
  • 圆形和椭圆
1
2
void cvCircle(CvArr* array, CvPoint center, int radius, CvScalar color, int thickness=1, int connectivity=8); // 圆形
void cvEllipse(CvArr* img, CvPoint center, CvSize axes, double angle, double start_angle, double end_angle, CvScalar color, int thickness=1, int line_type=8); // 椭圆
  • 多边形
1
void cvFillPoly(CvArr* img, CvPoint** pts, int* npts, int contours, CvScalar color, int line_type=8); // 多边形
  • 字体和文字
1
void cvPutText(CvArr* img, const char* text, CvPoint origin, const CvFont* font, CvScalr color); // 图像上输出文本

数据存储

  • 矩阵的存储和读取
1
2
3
CvMat A = cvMat(5, 5, CV_32F, the_matrix_data); // 创建矩阵
cvSave("my_matrix.xml", &A); // 存储矩阵
CvMat* A1 = (CvMat*) cvLoad("my_matrix.xml"); // 读取矩阵
  • xml格式文件的新建,存储与读取