OpenCV学习笔记(3)——基本数据类型


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

1. CvPoint以及其变体

这单个结构都非常简单,用于表示二维或三维的点(确切的说是点的坐标,通常坐标都是以0为基点),既有表示整数也有表示浮点型的。他们的定义分别如下:
<div id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:4bc3dde7-695c-47bc-b30c-a19b20696d67" class="wlWriterEditableSmartContent" style="float: none; margin: 0px; display: inline; padding: 0px;">
<pre class="brush: c;">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;</pre>
</div>
所有的OpenCV的数据类型都具有以其名称来定义的构造函数,例如cvPoint( )。(通常构造函数具有和结构类型一样的名称,只是首字母不大写)。因为C中没有类的概念,所以构造函数其实都是由内联函数实现的。比如上面介绍的3种类型都有如下构造函数:
<div id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:3153a725-b02d-4edd-871d-fdebc2bc6ec9" class="wlWriterEditableSmartContent" style="float: none; margin: 0px; display: inline; padding: 0px;">
<pre class="brush: c;">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);</pre>
</div>

2. CvSzie以及其变体

这三个结构都和矩形有关系,前两个结构都用来表示矩形框的大小,第一个以像素为精度,第二个以亚像素为精度。CvRect结构用于表示矩形框的偏移和大小。他们的定义及其构造函数如下:
<div id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:190ecac3-26cc-49b3-b8c9-cff1814c11e6" class="wlWriterEditableSmartContent" style="float: none; margin: 0px; display: inline; padding: 0px;">
<pre class="brush: c;">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;
}</pre>
</div>

3. CvScalar

这个结构也比较常用,它可以用来表示一个1、2、3、4元组(比如表示RGAB值)。定义如下:
<div id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:5d384648-25af-4517-84c8-a94adbebeb5a" class="wlWriterEditableSmartContent" style="float: none; margin: 0px; display: inline; padding: 0px;">
<pre class="brush: c;">typedef struct CvScalar
{
double val[4];
}
CvScalar;</pre>
</div>
这个结构有3个构造函数:
<div id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:d47a510b-fe29-4879-951e-20accd671345" class="wlWriterEditableSmartContent" style="float: none; margin: 0px; display: inline; padding: 0px;">
<pre class="brush: c;">/*

  • 第一个: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;
}</pre>
</div>
更多的数据类型可以参考OpenCV官方文档:http://docs.opencv.org/modules/core/doc/core.html


添加新评论

选择表情 captcha

友情提醒:不填或错填验证码会引起页面刷新,导致已填的评论内容丢失。

|