OpenCV绘图函数作用于任何象素深度的矩阵/图像. Antialiasing技术只能在8位图像上实现.所有的函数包括彩色图像的色彩参数(色彩参数是指rgb它是由宏CV_RGB或cvScalar函数构成。)和灰度图像的亮度。
如果一幅绘制图形部分或全部位于图像之外,那么对它先做裁剪。 对于彩色图像正常的色彩通道是B(蓝),G(绿),R(红)..。如果需要其它的色彩,可以通过cvScalar中的特殊色彩通道构造色彩,或者在绘制图像之前或之后 使用 cvCvtColor或者cvTransform来转换。
Parameters of Elliptic Arc
函数cvFillConvexPoly填充凸多边形内部。这个函数比函数cvFillPoly 更快。它除了可以填充凸多边形区域还可以填充任何的单调多边形。例如:一个被水平线(扫描线)至多两次截断的多边形。
在样本中用1替代 CV_FILLED 以指示的得到外形。
(注意:在cvFindContours中参数为CV_CHAIN_CODE时,cvDrawContours用CV_FILLED时不会画出任何图形)
例:使用直线迭代来计算沿着彩色线上的点的像素值。
如果一幅绘制图形部分或全部位于图像之外,那么对它先做裁剪。 对于彩色图像正常的色彩通道是B(蓝),G(绿),R(红)..。如果需要其它的色彩,可以通过cvScalar中的特殊色彩通道构造色彩,或者在绘制图像之前或之后 使用 cvCvtColor或者cvTransform来转换。
曲线与形状
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
- 坐标点的小数点位数。
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
- 坐标点的小数点位数。
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
- 圆心坐标点和半径值的小数点位数。
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
- 圆心坐标点和数轴的精度。
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
- 椭圆框顶点坐标的精度。
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
- 顶点坐标的小数点位数。
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
- 顶点的小数点位数。
文本
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。
PutText
在图像中显示文本字符串。void cvPutText( CvArr* img, const char* text, CvPoint org, const CvFont* font, CvScalar color );
- img
- 输入图像。
- text
- 要显示的字符串。
- org
- 第一个字符左下角的坐标。
- font
- 字体结构体。
- color
- 文本的字体颜色。
GetTextSize
获得字符串的宽度和高度。void cvGetTextSize( const char* text_string, const CvFont* font, CvSize* text_size, int* baseline );
- font
- 字体结构体
- text_string
- 输入字符串。
- text_size
- 合成字符串的字符的大小。文本的高度不包括基线以下的部分。
- baseline
- 相对于文字最底部点的基线的Y坐标。
点集和轮廓
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
- thickness
- 绘制轮廓时所使用的线条的粗细度。如果值为负(e.g. =CV_FILLED),绘制内层轮廓。
- line_type
- 线条的类型。参考cvLine.
- offset
- 按照给出的偏移量移动每一个轮廓点坐标.当轮廓是从某些感兴趣区域(ROI)中提取的然后需要在运算中考虑ROI偏移量时,将会用到这个参数。
#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 ); /* 用1替代 CV_FILLED 所指示的轮廓外形 */ 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)。
例:使用直线迭代来计算沿着彩色线上的点的像素值。
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); /* print the pixel coordinates: demonstrates how to calculate the coordinates */ { int offset, x, y; /* assume that ROI is not set, otherwise need to take it into account. */ offset = iterator.ptr - (uchar*)(image->imageData); y = offset/image->widthStep; x = (offset - y*image->widthStep)/(3*sizeof(uchar) /* size of pixel */); 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
- 线段的第二个端点,会被函数修改。
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。
收藏的用户(0) X
正在加载信息~
推荐阅读
最新回复 (0)
站点信息
- 文章2302
- 用户1336
- 访客10968998
每日一句
Qingming Festival invites us to honor ancestors with quiet reflection and respect.
清明节邀请我们以静思与敬意祭奠祖先。
清明节邀请我们以静思与敬意祭奠祖先。
新会员