OpenCV提供了许多的基本数据类型,这里学习一些比较常用的数据类型。C接口的基本都是用结构体或联合体来实现基本数据类型,C++接口的话使用模板来实现,但对于使用者而言,其实都是一样的。这里以C接口的为例介绍。

1. CvPoint以及其变体

这单个结构都非常简单,用于表示二维或三维的点(确切的说是点的坐标,通常坐标都是以0为基点),既有表示整数也有表示浮点型的。他们的定义分别如下:

typedef struct CvPoint
{
  int x;    // X坐标
  int y;    // Y坐标
}
CvPoint;

typedef struct CvPoint2D32f
{
  float x;    // X坐标
  float y;    // Y坐标
}
CvPoint2D32f;

typedef struct CvPoint3D32f
{
  float x;    // X坐标
  float y;    // Y坐标
  float z;    // Z坐标
}
CvPoint3D32f;

所有的OpenCV的数据类型都具有以其名称来定义的构造函数,例如cvPoint( )。(通常构造函数具有和结构类型一样的名称,只是首字母不大写)。因为C中没有类的概念,所以构造函数其实都是由内联函数实现的。比如上面介绍的3种类型都有如下构造函数:

inline CvPoint cvPoint(int x, int y);
inline CvPoint2D32f cvPoint2D32f(double x, double y);
inline CvPoint3D32f cvPoint3D32f(double x, double y, double z);

/*
 * 除了基本的构造函数以外,往往还可以通过一些转换函数进行构造
 */
inline CvPoint cvPointFrom32f(CvPoint2D32f point);
inline CvPoint2D32f cvPointTo32f(CvPoint point);

2. CvSzie以及其变体

这三个结构都和矩形有关系,前两个结构都用来表示矩形框的大小,第一个以像素为精度,第二个以亚像素为精度。CvRect结构用于表示矩形框的偏移和大小。他们的定义及其构造函数如下:

typedef struct CvSize
{
  int width;    // 矩形宽
  int height;    // 矩形高
}
CvSize;

inline CvSize cvSize(int width, int height)
{
  CvSize s;

  s.width = width;
  s.height = height;

  return s;
}

typedef struct CvSize2D32f
{
  float width;    // 矩形宽
  float height; // 矩形高
}
CvSize2D32f;

inline CvSize2D32f cvSize2D32f(double width, double height)
{
  CvSize2D32f s;

  s.width = (float)width;
  s.height = (float)height;

  return s;
}

typedef struct CvRect
{
  int x;    // 方形的最左角的X坐标
  int y;    // 方形的最上或者最下角的Y坐标
  int width;    // 宽
  int height;    // 高
}
CvRect;

inline CvRect cvRect(int x, int y, int width, int height)
{
  CvRect os;

  os.x = x;
  os.y = y;
  os.width = width;
  os.height = heigth;

  return os;
}

3. CvScalar

这个结构也比较常用,它可以用来表示一个1、2、3、4元组(比如表示RGAB值)。定义如下:

typedef struct CvScalar
{
  double val[4];
}
CvScalar;

这个结构有3个构造函数:

/*
 * 第一个:cvScalar( )。他需要1~4个参数,如果参数不足4个,其他量默认为0。
 */
inline CvScalar cvScalar(double val0, double val1, double val2, double val3)
{
  CvScalar scalar;

  scalar.val[0] = val0;    scalar.val[1] = val1;
  scalar.val[2] = val2; scalar.val[3] = val3;

  return scalar;
}

/*
 * 第二个:cvRealScalar().它只需要一个参数,用于初始化val[0],其他值设为0.
 */
inline CvScalar cvRealScalar(double val0)
{
  CvScalar scalar;

  scalar.val[0] = val0;    scalar.val[1] = 0;
  scalar.val[2] = 0; scalar.val[3] = 0;

  return scalar;
}

/*
 * 第三个:cvScalarAll(). 他需要一个参数,并且将val[]数组的4个元素都设为此值。
 */
inline CvScalar cvRealScalar(double val)
{
  CvScalar scalar;

  scalar.val[0] = val; scalar.val[1] = val;
  scalar.val[2] = val; scalar.val[3] = val;

  return scalar;
}

更多的数据类型可以参考OpenCV官方文档:http://docs.opencv.org/modules/core/doc/core.html