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.多边形
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; }运行结果: