您的位置:首页 > 运维架构

学习opencv----绘图

2013-11-06 10:52 246 查看
1.直线与矩形

绘制直线函数:void cvLine(CvArr* array,CvPoint pt1,CvPoint pt2, CvScalar color, int thickness=1, int connectivity=8 );

array一般为图像类型的指针IplImage*,pt1、pt2分别为直线的起点和终点,color为直线的颜色,thickness为直线的粗细,connectivity为直线的类型。

绘制矩形函数:void cvRectangle(CvArr* array,CvPoint pt1, Cvpoint pt2,CvScalar color,int thickness=1);

array一般为图像类型的指针IplImage*,pt1、pt2分别为矩形的左上点和右下点,color为矩形的颜色,thickness为矩形的粗细,也可以设为CV_FILL,其值为-1(封闭图形都可以设为CV_FILL),将以相同颜色填充矩形区域。

2.圆形与椭圆

绘制圆形函数:void cvCircle(CvArr* array,CvPoint center,int radius,CvScalar color,int thickness=1,int connectivity=8);

array一般为图像类型的指针IplImage*,center为圆心坐标,radius为半径,CvScalar为圆形颜色,thickness为圆弧的粗细,也可以设为CV_FILL,connectivity为圆弧的类型。

绘制椭圆函数1:cvEllipse(CvArr* array, Cvpoint center, CvSize axes,double angle, double start_angle,double end_angle,CvScalar color,int thickness=1,int line_type=8);

array一般为图像类型的指针IplImage*,center为椭圆中心坐标,axes为长短半轴长,angle为长短轴相对XY轴旋转角度,逆时针为正(运行结果有点不一致),start_angle椭圆弧起始角度,end_angle为椭圆弧终止角度(如需绘制完整椭圆应设置为0°-360°),CvScalar为椭圆弧颜色,thickness为椭圆弧的粗细,也可以设为CV_FILL,connectivity为圆弧的类型。

绘制椭圆函数2(外接矩形):cvEllipseBox(CvArr* array, CvBox2D box,CvScalar color,int thickness=1,int line_type=8,int shift);

array一般为图像类型的指针IplImage*,box为外接矩形,CvScalar为椭圆弧颜色,thickness为椭圆弧的粗细,也可以设为CV_FILL,connectivity为圆弧的类型,shift为平移和缩小比例。

CvBox2D为一种数据结构,其定义如下:

typdef struct

{

CvPoint2D32f center;//CvPoint 的浮点形式,矩形中心

CvSize2D32f size;//CvSize浮点形式。矩形的大小

float angle;//矩形相对XY轴的旋转角度

}CvBox2D;

常用语句:

CvBox2D box;
box.center=cvPoint2D32f(170,170);
box.size=cvSize2D32f(100,60);
box.angle=0;
cvEllipseBox(img,box,CV_RGB(255,255,0),1,8,0);
3.多边形

绘制多边形函数1:void cvFillPoly(CvArr* array,CvPoint** pts,int* npts,int contours,CvScalar color,int line_type=8);
array一般为图像类型的指针IplImage*,pts为Cvpoint多维数组指针,提供多个多边形顶点坐标,npts为每个多边形的顶点数目,与多边形对应,其它变量与上述函数一致。

常用语句:

CvPoint** pts=new CvPoint*[1];
pts[0] = new CvPoint[4];
pts[0][0] = cvPoint(0,0);
pts[0][1] = cvPoint(100,0);
pts[0][2] = cvPoint(100,100);
pts[0][3] = cvPoint(0,100);
int npts[1];
npts[0]=4;
cvFillPoly(img,pts,npts,1,CV_RGB(255,255,255),8);
绘制多边形函数2:void cvFIllConvexPoly(CvArr* array,CvPoint* pts,int npts,CvScalar,int line_type=8);

pts为CvPoint数组,提供多边形顶点坐标,一次只允许绘制一个多边形,而且只能画凸多边形,运行速度较快。

常用语句:

CvPoint pts[4];
pts[0] = cvPoint(0,0);
pts[1] = cvPoint(100,20);
pts[2] = cvPoint(80,100);
pts[3] = cvPoint(0,10);
int npts=4;
cvFillConvexPoly(img,pts,npts,CV_RGB(255,255,0),8);
绘制多边形函数3:void cvPolyLine(CvArr* array,CvPoint** pts,int* pts,int contours,int is_closed,CvScalar color, int thickness=1,int line_type=8);

参数与cvFillPoly()相同,多出一个变量is_closed,设为true,那么下一个多边形的第一线段就会从上一多边形的最后一点开始。

4.文字

绘制文字函数:void cvPutText(CvArr* array,const char* text,CvPoint origin, const CvFont* font,CvScalar color);

text为char数组,存放绘制文字,font必须用CvFont申明,然后把它传递给cvInitFont()。

cvInitFont(CvFont* font, int font_face,double hscale,double vscale, double shear, int thickness=1,int line_type=8);

font_face为字体,hscale和cscale只能设为1.0或0.5,字体渲染时选择全高或半高,shear创建斜体,0.0不斜体,1.0斜体45°。

常用语句:

char text[]="The is a test!";
CvFont font;
cvInitFont(&font,CV_FONT_HERSHEY_SCRIPT_COMPLEX,1.0f,1.0f,0.0,2,8);
cvPutText(img,text,cvPoint(200,400),&font,CV_RGB(255,15,5));
程序示例:

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <opencv2/opencv.hpp>

using namespace cv;

int main(int argc,char** argv)
{
IplImage* img=cvLoadImage("../img.png");
cvNamedWindow("test",CV_WINDOW_AUTOSIZE);
//draw line
cvLine(img,cvPoint(20,20),cvPoint(320,320),CV_RGB(255,0,0),1,1);
//draw rectangle
cvRectangle(img,cvPoint(20,20),cvPoint(320,320),CV_RGB(0,255,0),1);
//draw circle
cvCircle(img,cvPoint(170,170),150,CV_RGB(0,0,255),1,8);
//draw ellipse
cvEllipse(img,cvPoint(170,170),cvSize(100,60),-10,0,360,CV_RGB(0,255,0),1,8);
cvRectangle(img,cvPoint(120,140),cvPoint(220,200),CV_RGB(255,255,0),1);
CvBox2D box; box.center=cvPoint2D32f(170,170); box.size=cvSize2D32f(100,60); box.angle=0; cvEllipseBox(img,box,CV_RGB(255,255,0),1,8,0);
//draw poly
CvPoint** pts=new CvPoint*[1];
pts[0] = new CvPoint[4];
pts[0][0] = cvPoint(0,0);
pts[0][1] = cvPoint(100,0);
pts[0][2] = cvPoint(100,100);
pts[0][3] = cvPoint(0,100);
int npts[1];
npts[0]=4;
//cvFillPoly(img,pts,npts,1,CV_RGB(255,255,255),8);
cvPolyLine(img,pts,npts,1,true,CV_RGB(0,0,255),1,8);
CvPoint pts1[4];
pts1[0] = cvPoint(0,0);
pts1[1] = cvPoint(100,20);
pts1[2] = cvPoint(80,100);
pts1[3] = cvPoint(0,10);
int npts1=4;
cvFillConvexPoly(img,pts1,npts1,CV_RGB(255,255,0),8);
//text
char text[]="The is a test!"; CvFont font; cvInitFont(&font,CV_FONT_HERSHEY_SCRIPT_COMPLEX,1.0f,1.0f,0.0,2,8); cvPutText(img,text,cvPoint(200,400),&font,CV_RGB(255,15,5));
cvShowImage("test",img);
cvWaitKey(0);
cvReleaseImage(&img);
cvDestroyWindow("test");
return 0;
}
运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: