opencv的基本数据类型CvPoint,CvSize,CvRect,CvScalar
1)CvPoint:表示一个坐标为整数的二维点,是一个包含integer类型成员x和y的简单结构体。
typedef struct CvPoint{
int x;//图像中点的x坐标
int y;//图像中点的y坐标
}CvPoint;
给结构体CvPoint取别名,以后可以直接用CvPoint来命名变量,每个变量包含两个数据坐标。
函数原型:CV_INLINE CvPoint cvPoint( int x, int y )
{
CvPoint p;
p.x = x;
p.y = y;
return p;
}
变体类型:
CvPoint2D32f //float x,y 二维空间中的点CvPoint2D64f //double类型
CvPoint3D32f //float x, y, z 三维空间中的点
CvPoint3D64f //double类型
{
float x;
float y;
}CvPoint2D32f; 这个原型跟CvPoint的原理是一样的,只是数据的类型不同而已。
二维浮点型数据:
CV_INLINE CvPoint2D32f cvPoint2D32f( double x, double y ){
CvPoint2D32f p;
p.x = (float)x;
p.y = (float)y;
return p;
}
类型转换:
将整形数据转换为浮点型数据:CV_INLINE CvPoint2D32f cvPointTo32f( CvPoint point )
{
return cvPoint2D32f( (float)point.x, (float)point.y );
} //把整型数据转换为32位浮点型数据,这个很容易理解。
将浮点型数据转换为整形数据:
CV_INLINE CvPoint cvPointFrom32f( CvPoint2D32f point ){
CvPoint ipt;
ipt.x = cvRound(point.x);
ipt.y = cvRound(point.y);
return ipt;
} //把32位浮点型数据转换为整型数据。这个很容易理解。
cvRound
原型是:int cvRound (double value)
作用是:对一个double型的数进行四舍五入,并返回一个整型数!
函数 cvRound, cvFloor, cvCeil 用一种舍入方法将输入浮点数转换成整数。 cvRound 返回和参数最接近的整数值。 cvFloor 返回不大于参数的最大整数值。
cvCeil 返回不小于参数的最小整数值。在某些体系结构中该函数 工作起来比标准 C 操作起来还要快。
2)CvSize:表示矩阵框大小,以像素为精度。
与CvPoint结构类似,但数据成员是integer类型的width和height。
typedef struct{
int width;/* 矩形宽 */
int height; /* 矩形高 */
}
CvSize;
CV_INLINE CvSize cvSize( int width, int height )
{
CvSize s;
s.width = width;
s.height = height;
return s;
}
变体类型:CvSize2D32f 表示浮点型数据
3)CvRect:通过方形左上角坐标和方形的高和宽来确定一个矩形区域
typedef struct CvRect
{
int x; /* 方形的左上角的x-坐标 */int y; /* 方形的左上角的y-坐标*/
int width; /* 宽 */
int height; /* 高 */
}
//包含4个成员元素,其中x,y用来确定区域左上角的坐标,width和height确定区域大小。全都是整型数据。
CV_INLINE CvRect cvRect( int x, int y, int width, int height )
{
CvRect r;
r.x = x;
r.y = y;
r.width = width;
r.height = height;
return r;
}
4)CvScalar :这个 CvScalar就是一个可以用来存放4个double数值的数组(O'Reilly的书上写的是4个整型成员);一般用来存放像素值(不一定是灰度值哦)的,最多可以存放4个通道的。
typedef struct CvScalar
{
double val[4];
}
CvScalar;
CV_INLINE CvScalar cvScalar( double val0, double val1 CV_DEFAULT(0),
double val2 CV_DEFAULT(0), double val3 CV_DEFAULT(0))
{
CvScalar scalar;
scalar.val[0] = val0;
scalar.val[1] = val1;
scalar.val[2] = val2;
scalar.val[3] = val3;
return scalar;
}
cvScalar包含4个double类型的数值,分别是val[0],val[1],val[2]和val[3]。这个很容易与前面几个类型混淆,要注意区分清楚。
下面又4个cvScalar类型的函数:
1. inline CvScalar cvScalar( double val0, double val1=0,double val2=0, double val3=0 );
//最通用的,可初始化0-4个通道举例:
a) 存放单通道图像中像素:cvScalar(255);
b) 存放三通道图像中像素:cvScalar(255,255,255);
2. inline CvScalar cvRealScalar( double val0 );
//只使用第一个通道,val=val0;等同于cvScalar(val0,0,0,0);3. inline CvScalar cvScalarAll( double val0123 );
//所用通道值用同一个val0123赋值
4. CV_RGB
CV_RGB是OPENCV中的一个宏,用于创建一个色彩值:
#define CV_RGB(r,g,b) cvScalar((b),(g),(r),0)。
看到转换为cvScalar时,rgb的顺序变为bgr,这是因为opencv中存储RGB模式彩图时,采用的通道顺序是BGR.
两个变体类型:cvRealScalar,cvScalarAll
CV_INLINE CvScalar cvRealScalar( double val0 ){
CvScalar scalar;
scalar.val[0] = val0;
scalar.val[1] = scalar.val[2] = scalar.val[3] = 0;
return scalar;
}
cvRealScalar函数变体的意义是:只使用1个val[0]的值,其他3个值全部默认为0。
{
CvScalar scalar;
scalar.val[0] = val0123;
scalar.val[1] = val0123;
scalar.val[2] = val0123;
scalar.val[3] = val0123;
return scalar;
}
cvScalarAll的意义是全部值都设置为val0123。
5)cvRectangle:通过对角线上的两个顶点绘制简单、指定粗细或者带填充的矩形
函数原型:
void cvRectangle( CvArr* img, CvPoint pt1, CvPoint pt2,
CvScalar color,int thickness=1, int line_type=8, int shift=0 );
参数介绍:img -- 图像.
pt1 -- 矩形的一个顶点。
pt2 -- 矩形对角线上的另一个顶点
color -- 线条颜色 (RGB) 或亮度(灰度图像 )(grayscale image)。
thickness -- 组成矩形的线条的粗细程度。取负值时(如 CV_FILLED)函数绘制填充了色彩的矩形。
line_type -- 线条的类型。见cvLine的描述
shift -- 坐标点的小数点位数。