曲线与形状
CV_RGB
创建一个色彩值.
#define CV_RGB( r, g, b ) cvScalar( (b), (g), (r) )
Line
绘制连接两个点的线段
void cvLine( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1, int line_type=8, int shift=0 );
-
img
- 图像。 pt1
- 线段的第一个端点。 pt2
- 线段的第二个端点。 color
- 线段的颜色。 thickness
- 线段的粗细程度。 line_type
-
线段的类型。
- 8 (or 0) - 8-connected line(8邻接)连接 线。
- 4 - 4-connected line(4邻接)连接线。
- CV_AA - antialiased 线条。
-
shift
- 坐标点的小数点位数。
函数cvLine 在图像中的点1和点2之间画一条线段。线段被图像或感兴趣的矩形(ROI rectangle)所裁剪。对于具有整数坐标的non-antialiasing 线条,使用8-连接或者4-连接Bresenham 算法。画粗线条时结尾是圆形的。画 antialiased 线条使用高斯滤波。要指定线段颜色,用户可以使用使用宏CV_RGB( r, g, b )。
Rectangle
绘制简单、指定粗细或者带填充的 矩形
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
- 坐标点的小数点位数。
函数 cvRectangle 通过对角线上的两个顶点绘制矩形。
Circle
绘制圆形。
void cvCircle( CvArr* img, CvPoint center, int radius, CvScalar color, int thickness=1, int line_type=8, int shift=0 );
-
img
- 图像。 center
- 圆心坐标。 radius
- 圆形的半径。 color
- 线条的颜色。 thickness
- 如果是正数,表示组成圆的线条的粗细程度。否则,表示圆是否被填充。 line_type
- 线条的类型。见 cvLine 的描述 shift
- 圆心坐标点和半径值的小数点位数。
函数cvCircle绘制或填充一个给定圆心和半径的圆。圆被感兴趣矩形所裁剪。 若指定圆的颜色,可以使用宏 CV_RGB ( r, g, b )。
Ellipse
绘制椭圆圆弧和椭圆扇形。
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, int shift=0 );
-
img
- 图像。 center
- 椭圆圆心坐标。 axes
- 轴的长度。 angle
- 偏转的角度。 start_angle
- 圆弧起始角的角度。. end_angle
- 圆弧终结角的角度。 color
- 线条的颜色。 thickness
- 线条的粗细程度。 line_type
- 线条的类型,见CVLINE的描述。 shift
- 圆心坐标点和数轴的精度。
函数cvEllipse用来绘制或者填充一个简单的椭圆弧或椭圆扇形。圆弧被ROI矩形所忽略。反走样弧线和粗弧线使用线性分段近似值。所有的角都是以角度的形式给定的。下面的图片将解释这些参数的含义。
Parameters of Elliptic Arc
EllipseBox
使用一种简单的方式来绘制椭圆圆弧和椭圆扇形。
void cvEllipseBox( CvArr* img, CvBox2D box, CvScalar color, int thickness=1, int line_type=8, int shift=0 );
-
img
- 图像。 box
- 绘制椭圆圆弧所需要的外界矩形. thickness
- 分界线线条的粗细程度。 line_type
- 分界线线条的类型,见CVLINE的描述。 shift
- 椭圆框顶点坐标的精度。
The function cvEllipseBox draws a simple or thick ellipse outline, or fills an ellipse. The functions provides a convenient way to draw an ellipse approximating some shape; that is what cvCamShift and cvFitEllipse do. The ellipse drawn is clipped by ROI rectangle. A piecewise-linear approximation is used for antialiased arcs and thick arcs.
FillPoly
填充多边形内部
void cvFillPoly( CvArr* img, CvPoint** pts, int* npts, int contours, CvScalar color, int line_type=8, int shift=0 );
-
img
- 图像。 pts
- 指向多边形的数组指针。 npts
- 多边形的顶点个数的数组。 contours
- 组成填充区域的线段的数量。 color
- 多边形的颜色。 line_type
- 组成多边形的线条的类型。 shift
- 顶点坐标的小数点位数。
函数cvFillPoly用于一个单独被多边形轮廓所限定的区域内进行填充。函数可以填充复杂的区域,例如,有漏洞的区域和有交叉点的区域等等。
FillConvexPoly
填充凸多边形
void cvFillConvexPoly( CvArr* img, CvPoint* pts, int npts, CvScalar color, int line_type=8, int shift=0 );
-
img
- 图像。 pts
- 指向单个多边形的指针数组。 npts
- 多边形的顶点个数。 color
- 多边形的颜色。 line_type
- 组成多边形的线条的类型。参见cvLine shift
- 顶点坐标的小数点位数。
函数cvFillConvexPoly填充凸多边形内部。这个函数比函数cvFillPoly 更快。它除了可以填充凸多边形区域还可以填充任何的单调多边形。例如:一个被水平线(扫描线)至多两次截断的多边形。
PolyLine
绘制简单线段或折线。
void cvPolyLine( CvArr* img, CvPoint** pts, int* npts, int contours, int is_closed, CvScalar color, int thickness=1, int line_type=8, int shift=0 );
-
img
- 图像。 pts
- 折线的顶点指针数组。 npts
- 折线的定点个数数组。也可以认为是pts指针数组的大小 contours
- 折线的线段数量。 is_closed
- 指出多边形是否封闭。如果封闭,函数将起始点和结束点连线。 color
- 折线的颜色。 thickness
- 线条的粗细程度。 line_type
- 线段的类型。参见cvLine。 shift
- 顶点的小数点位数。
函数cvPolyLine 绘制一个简单直线或折线。
文本
InitFont
初始化字体结构体。
void cvInitFont( CvFont* font, int font_face, double hscale, double vscale, double shear=0, int thickness=1, int line_type=8 );
-
font
- 被初始化的字体结构体。 font_face
-
字体名称标识符。只是Hershey 字体集(
http://sources.isc.org/utils/misc/hershey-font.txt )的一个子集得到支持。
- CV_FONT_HERSHEY_SIMPLEX - 正常大小无衬线字体。
- CV_FONT_HERSHEY_PLAIN - 小号无衬线字体。
- CV_FONT_HERSHEY_DUPLEX - 正常大小无衬线字体。( 比CV_FONT_HERSHEY_SIMPLEX更复杂)
- CV_FONT_HERSHEY_COMPLEX - 正常大小有衬线字体。
- CV_FONT_HERSHEY_TRIPLEX - 正常大小有衬线字体 ( 比CV_FONT_HERSHEY_COMPLEX更复杂)
- CV_FONT_HERSHEY_COMPLEX_SMALL - CV_FONT_HERSHEY_COMPLEX 的小译本。
- CV_FONT_HERSHEY_SCRIPT_SIMPLEX - 手写风格字体。
- CV_FONT_HERSHEY_SCRIPT_COMPLEX - 比CV_FONT_HERSHEY_SCRIPT_SIMPLEX更复杂。
- 这个参数能够由一个值和可选择的CV_FONT_ITALIC字体标记合成,就是斜体字。 hscale
- 字体宽度。如果等于1.0f,字符的宽度是最初的字体宽度。如果等于0.5f,字符的宽度是最初的字体宽度的一半。 vscale
- 字体高度。如果等于1.0f,字符的高度是最初的字体高度。如果等于0.5f,字符的高度是最初的字体高度的一半。 shear
- 字体的斜度。当值为0时 ,字符不倾斜;当值为1.0f时,字体倾斜≈45度,等等。厚度让字母着重显示。函数cvLine用于绘制字母。 thickness
- 字体笔划的粗细程度。 line_type
- 字体笔划的类型,参见cvLine。
函数cvInitFont初始化字体结构体,字体结构体可以被传递到文字显示函数中。
PutText
在图像中显示文本字符串。
void cvPutText( CvArr* img, const char* text, CvPoint org, const CvFont* font, CvScalar color );
-
img
- 输入图像。 text
- 要显示的字符串。 org
- 第一个字符左下角的坐标。 font
- 字体结构体。 color
- 文本的字体颜色。
函数cvPutText将具有指定字体的和指定颜色的文本加载到图像中。加载到图像中的文本被感兴趣的矩形框(ROI rectangle)剪切。不属于指定字体库的字符用矩形字符替代显示。
GetTextSize
获得字符串的宽度和高度。
void cvGetTextSize( const char* text_string, const CvFont* font, CvSize* text_size, int* baseline );
-
font
- 字体结构体 text_string
- 输入字符串。 text_size
- 合成字符串的字符的大小。文本的高度不包括基线以下的部分。 baseline
- 相对于文字最底部点的基线的Y坐标。
函数cvGetTextSize是用于在指定字体时计算字符串的绑定区域(binding rectangle)。
点集和轮廓
DrawContours
在图像中绘制外部和内部的轮廓。
void cvDrawContours( CvArr *img, CvSeq* contour, CvScalar external_color, CvScalar hole_color, int max_level, int thickness=1, int line_type=8, CvPoint offset=cvPoint(0,0) );
-
img
- 用以绘制轮廓的图像。和其他绘图函数一样,边界图像被感兴趣区域(ROI)所剪切。 contour
- 指针指向第一个轮廓。 external_color
- 外层轮廓的颜色。 hole_color
- 内层轮廓的颜色。 max_level
绘制轮廓的最大等级。如果等级为0,绘制单独的轮廓。如果为1,绘制轮廓及在其后的相同的级别下轮廓。如果值为2,所有的轮廓。如果等级为2,绘制所有同级轮廓及所有低一级轮廓,诸此种种。如果值为负数,函数不绘制同级轮廓,但会升序绘制直到级别为abs(max_level)-1的子轮廓。
-
thickness
- 绘制轮廓时所使用的线条的粗细度。如果值为负(e.g. =CV_FILLED),绘制内层轮廓。 line_type
- 线条的类型。参考cvLine. offset
- 按照给出的偏移量移动每一个轮廓点坐标.当轮廓是从某些感兴趣区域(ROI)中提取的然后需要在运算中考虑ROI偏移量时,将会用到这个参数。
当thickness>=0,函数cvDrawContours在图像中绘制轮廓,或者当thickness<0时,填充轮廓所限制的区域。
#include "cv.h" #include "highgui.h" int main( int argc, char** argv ) { IplImage* src; // 第一条命令行参数确定了图像的文件名。 if( argc == 2 && (src=cvLoadImage(argv[1], 0))!= 0) { IplImage* dst = cvCreateImage( cvGetSize(src), 8, 3 ); CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* contour = 0; cvThreshold( src, src, 1, 255, CV_THRESH_BINARY ); cvNamedWindow( "Source", 1 ); cvShowImage( "Source", src ); cvFindContours( src, storage, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE ); cvZero( dst ); for(; contour != 0; contour = contour->h_next ) { CvScalar color = CV_RGB( rand()&255, rand()&255, rand()&255 ); cvDrawContours( dst, contour, color, color, -1, CV_FILLED, 8 ); } cvNamedWindow( "Components", 1 ); cvShowImage( "Components", dst ); cvWaitKey(0); } }
在样本中用1替代 CV_FILLED 以指示的得到外形。
(注意:在cvFindContours中参数为CV_CHAIN_CODE时,cvDrawContours用CV_FILLED时不会画出任何图形)
InitLineIterator
初始化直线迭代器
int cvInitLineIterator( const CvArr* image, CvPoint pt1, CvPoint pt2, CvLineIterator* line_iterator, int connectivity=8, int left_to_right=0 );
-
img
- 用以获取直线的图像。 pt1
- 线段的第一个端点。 pt2
- 线段的第二个端点。 line_iterator
- 指向直线迭代状态结构体的指针。 connectivity
- 直线的邻接方式,4邻接或者8邻接。 left_to_right
- 标志值,指出扫描直线是从pt1和pt2外面最左边的点扫描到最右边的点(left_to_right≠0),还是按照指定的顺序,从pt1到pt2(left_to_right=0)。
函数cvInitLineIterator初始化直线迭代器并返回两个端点间点的数目。两个端点都必须在图像内部。在迭代器初始化以后,所有的在连接两个终点的栅栏线上的点,可以通过访问CV_NEXT_LINE_POINT点的方式获得。在线上的这些点使用4-邻接或者8-邻接的Bresenham算法计算得到。
例:使用直线迭代来计算沿着彩色线上的点的像素值。
CvScalar sum_line_pixels( IplImage* image, CvPoint pt1, CvPoint pt2 ) { CvLineIterator iterator; int blue_sum = 0, green_sum = 0, red_sum = 0; int count = cvInitLineIterator( image, pt1, pt2, &iterator, 8, 0 ); for( int i = 0; i < count; i++ ){ blue_sum += iterator.ptr[0]; green_sum += iterator.ptr[1]; red_sum += iterator.ptr[2]; CV_NEXT_LINE_POINT(iterator); { int offset, x, y; offset = iterator.ptr - (uchar*)(image->imageData); y = offset/image->widthStep; x = (offset - y*image->widthStep)/(3*sizeof(uchar) ); printf("(%d,%d)\n", x, y ); } } return cvScalar( blue_sum, green_sum, red_sum ); }
ClipLine
剪切图像矩形区域内部的直线。
int cvClipLine( CvSize img_size, CvPoint* pt1, CvPoint* pt2 );
-
img_size
- 图像的大小。 pt1
- 线段的第一个端点,会被函数修改。 pt2
- 线段的第二个端点,会被函数修改。
函数cvClipLine计算线段完全在图像中的一部分。如果线段完全在图像中,返回0,否则返回1。
Ellipse2Poly
用折线逼近椭圆弧
int cvEllipse2Poly( CvPoint center, CvSize axes, int angle, int arc_start, int arc_end, CvPoint* pts, int delta );
-
center
- 弧线的中心。 axes
- 弧线的Half-sizes。参见下图。 angle
- 椭圆的旋转角度(Rotation angle),参见下图。 start_angle
- 椭圆的Starting angle,参见下图。 end_angle
- 椭圆的Ending angle,参见下图。 pts
- 坐标点矩阵数组,由本函数填充。 delta
- 与下一条折线定点的夹角,近似精度。故,得到的点数最大为ceil((end_angle - start_angle)/delta) + 1。