OpenCV基础结构


OpenCV提供了多种基本数据类型。虽然这些数据类型在C语言中不是基本类型,但结构都很简单,可将它们作为原子类型。可以在"…/OpenCV/cxcore/include"目录下的cxtypes.h文件中查看其详细定义。

在这些数据类型中最简单的就是CvPoint。CvPoint是一个包含integer类型成员x和y的简单结构体。CvPoint有两个变体类型:CvPoint2D32f和CvPoint3D32f。前者同样有两个成员x,y,但它们是浮点类型;而后者却多了一个浮点类型的成员z。

CvSize类型与CvPoint非常相似,但它的数据成员是integer类型的width和height。如果希望使用浮点类型,则选用CvSize的变体类型CvSize2D32f。

CvRect类型派生于CvPoint和CvSize,它包含4个数据成员:x,y,width和height。(正如你所想的那样,该类型是一个复合类型)。

下一个(但不是最后一个)是包含4个整型成员的CvScalar类型,当内存不是问题时,CvScalar经常用来代替1,2或者3个实数成员(在这个情况下,不需要的分量被忽略)。CvScalar有一个单独的成员val,它是一个指向4个双精度浮点数数组的指针。

所有这些数据类型具有以其名称来定义的构造函数,例如cvSize()。(构造函数通常具有与结构类型一样的名称,只是首字母不大写)。记住,这是C而不是C++,所以这些构造函数只是内联函数,它们首先提取参数列表,然后返回被赋予相关值的结构。

各数据类型的内联构造函数被列在表3-1中:cvPointXXX(),cvSize(),cvRect()和cvScalar()。这些结构都十分有用,因为它们不仅使代码更容易编写,而且也更易于阅读。假设要在(5,10)和(20,30)之间画一个白色矩形,只需简单调用:

cvRectangle(myImg, cvPoint(5,10),cvPoint(20,30),cvScalar(255,255,255));表1:points,size, rectangles和calar三元组的结构

结构

成员

意义

CvPoint

intx, y

图像中的点

CvPoint2D

floatx, y

二维空间中的点

CvPoint3D

floatx, y, z

三维空间中的点

CvSize

intwidth,

height

图像的尺寸

CvRect

intx, y,

width,height

图像的部分区域

CvScalar

doubleval[4]

RGBA

cvScalar是一个特殊的例子:它有3个构造函数。第一个是cvScalar(),它需要一个、两个、三个或者四个参数并将这些参数传递给数组val[]中的相应元素。第二个构造函数是cvRealScalar(),它需要一个参数,它被传递给给val[0],而val[]数组别的值被赋为0。最后一个有所变化的是cvScalarAll(),它需要一个参数并且val[]中的4个元素都会设置为这个参数。

CvPoint

二维坐标系下的点,类型为整型

typedef struct CvPoint
 {
  int x; /* X坐标, 通常以0为基点 */
  int y; /* y坐标, 通常以0为基点 */
 }
CvPoint;
/* 构造函数 */
inline CvPoint cvPoint( int x, int y );
/* 从 CvPoint2D32f类型转换得来 */
inline CvPoint cvPointFrom32f( CvPoint2D32f point )

CvPoint2D32f

二维坐标下的点,类型为浮点

typedef struct CvPoint2D32f
 {
  float x; /* X��标, 通常以0为基点*/
  float y; /* Y坐标, 通常以0为基点*/
 }
CvPoint2D32f;
/* 构造函数 */
inline CvPoint2D32f cvPoint2D32f( double x, double y );
/* 从CvPoint转换来 */
inline CvPoint2D32f cvPointTo32f( CvPoint point );

CvSize

矩形框大小,以像素为精度

typedef struct CvSize
 {
  int width;  /* 矩形宽 */
  int height; /* 矩形高 */
 }
 CvSize;
/* 构造函数 */
inline CvSize cvSize( int width, int height );

注意:构造函数的cv是小写!

CvSize2D32f

以亚像素精度标量矩形框大小

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;
}

CvRect

矩形框的偏移和大小

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;
     
      reture os;
}

CvScalar

可存放在1-,2-,3-,4-TUPLE类型的捆绑数据的容器

typedef struct CvScalar
 {
  double val[4]
 }
 CvScalar;
/* 构造函数:用val0初始化val[0]用val1初始化val[1], 以此类推*/
inline CvScalar cvScalar( double val0, double val1,
                          double val2, double val3);

{  CvScalar  arr;
    arr.val[4] = {val0,val1,val2,val3}; 
    reture arr;
}

//最通用的,可初始化0-4个通道

举例:

a)存放单通道图像中像素:cvScalar(255);

b)存放三通道图像中像素:cvScalar(255,255,255);

/* 构造函数:用val0123初始化所有val[0]...val[3] */
inline CvScalar cvScalarAll( double val0123 );
 
  { CvScalar arr;
 
    arr.val[4] = {val0123,val0123,val0123,val0123,};

    reture arr;}
/* 构造函数:用val0初始化val[0],用0初始化val[1],val[2],val[3] */
inline CvScalar cvRealScalar( double val0 );

{
      CvScalar arr;
      arr.val[4] = {val0}; 
      reture arr;
}

CV_RGB

CV_RGB是OPENCV中的一个宏,用于创建一个色彩值:

#defineCV_RGB(r,g,b)  cvScalar((b),(g),(r),0)。

看到转换为cvScalar时,rgb的顺序变为bgr,这是因为opencv中存储RGB模式彩图时,采用的通道顺序是BGR.

举例:CvScalarcolor = CV_RGB( rand()&255,    rand()&255,rand()&255 )

  • 1
  • 2
  • 下一页

相关内容