win7+VS2013+OpenCV2.4.9
一、直线
绘制直线的函数:
void cvLine(
CvArr* img,//绘图载体,一般是 IplImage*
CvPoint pt1,//起始点
CvPoint pt2,//终止点
CvScalar color,//颜色,可用宏CV_RGB(int r,int g,int b)生成
int thickness=1,//线宽
int line_type=8,//线型,8连通或4连通
int shift=0//顶点坐标小数点位数
);
二、矩形
绘制矩形的函数:
void cvRectangle(
CvArr* img,//绘图载体,一般是 IplImage*
CvPoint pt1,//左上角起始点
CvPoint pt2,//右下角起始点
CvScalar color,//颜色,可用宏CV_RGB(int r,int g,int b)生成
int thickness = 1,//线宽
int line_type=8,//线型,8连通或4连通
int shift=0//顶点坐标小数点位数
);
三、圆形
绘制圆形的函数:
void cvCircle (
CvArr* img,//绘图载体,一般是 IplImage*
CvPoint center,//圆心坐标
int radius,//半径长度(像素单位)
CvScalar color,//颜色,可用宏CV_RGB(int r,int g,int b)生成
int thickness = 1,//线宽
int line_type=8,//线型,8连通或4连通
int shift=0//顶点坐标小数点位数
);
四、椭圆
1、绘制椭圆的函数:
void cvEllipse(
CvArr* img,//绘图载体,一般是 IplImage*
CvPoint center,//圆心坐标
CvSize axes,//长半轴和短半轴长度
double angle,//相对于水平轴偏角,顺时针为正
double start_angle,//起始角度,一般为0
double end_angle,//终止角度,一般为360
CvScalar color,//颜色,可用宏CV_RGB(int r,int g,int b)生成
int thickness = 1,//线宽
int line_type = 8,//线型,8连通或4连通
int shift=0//顶点坐标小数点位数
);
2、或者使用外接矩形绘制椭圆:
void cvEllipseBox(
CvArr* img,//绘图载体,一般是 IplImage*
CvBox2D box,//描述外接矩形的struct
CvScalar color,//颜色,可用宏CV_RGB(int r,int g,int b)生成
int thickness = 1,//线宽
int line_type = 8,//线型,8连通或4连通
int shift = 0//顶点坐标小数点位数
);
CvBox2D 结构体的定义:
typdef struct {
CvPoint2D32f center;//外接矩形的中心,也就是椭圆的中心
CvSize2D32f size;//外接矩形的宽度和长度,也就是椭圆的两轴长度
float angle;//水平坐标轴和矩形first side 之间的夹角
} CvBox2D;
注意:cvEllipseBox是指定长轴和短轴的长度,而cvEllipse是指定长半轴和短半轴的长度。
CvBox2D的用法举例:CvBox2D box;//CvBox2D没有带参数的构造函数,只能使用默认构造函数或copy构造函数
box.center=cvPoint2D32f(110,110);//外接矩形的中心,也就是椭圆的中心
box.size=cvSize2D32f(40,80);//外接矩形的宽度和长度,也就是椭圆的两轴长度
box.angle=40;//水平坐标轴和矩形first side 之间的夹角
cvEllipseBox(src1,box,CV_RGB(0,0,255),2,8);//使用外接矩形绘制椭圆
五、多边形polygon
1、同时绘制多个多边形并填充:
void cvFillPoly(
CvArr* img,//绘图载体,一般是 IplImage*
CvPoint** pts,//顶点坐标二维数组,每一列代表一个多边形
int* npts,//多边形顶点数的数组,此数组大小就是pts的列数
int contours,//绘制多边形的数量
CvScalar color,//颜色,可用宏CV_RGB(int r,int g,int b)生成
int line_type = 8//线型,8连通或4连通
int shift = 0//顶点坐标小数点位数
);
2、只绘制一个多边形并填充成凸多面体:
void cvFillConvexPoly(
CvArr* img,//绘图载体,一般是 IplImage*
CvPoint* pts,//顶点坐标一维数组
int npts,//多边形顶点数
CvScalar color,//颜色,可用宏CV_RGB(int r,int g,int b)生成
int line_type = 8,//线型,8连通或4连通
int shift = 0//顶点坐标小数点位数
);
注意:此函数填充的凸多面体不是严格意义上的。
所谓凸多边形,就是把一个多边形任意一边向两方无限延长成为一条直线,如果多边形的其他各边均在此直线的同旁,那么这个多边形就叫做凸多边形。
void cvPolyLine(
CvArr* img,//绘图载体,一般是 IplImage*
CvPoint** pts,//顶点坐标二维数组,每一列代表一个多边形
int* npts,//多边形顶点数的数组,此数组大小就是pts的列数
int contours,//绘制多边形的数量
int is_closed,//是否闭合
CvScalar color,//颜色,可用宏CV_RGB(int r,int g,int b)生成
int thickness = 1,//线型,8连通或4连通
int line_type = 8//顶点坐标小数点位数
int shift = 0//顶点坐标小数点位数
);
六、例程:
#include "cv.h"
#include"highgui.h"
int main(int argc,char** argv)
{
IplImage* src1=NULL;
if(argc<2)
{
//new image
src1=cvCreateImage(cvSize(512,512),8,3);
cvSetZero(src1);
}
else
//load image
src1=cvLoadImage(argv[1],1);
cvNamedWindow("src",CV_WINDOW_AUTOSIZE);
CvSize size=cvGetSize(src1);
//draw line
cvLine(src1,cvPoint(10,10),cvPoint(size.height/2,size.width/2),CV_RGB(255,255,255),1,8);
//draw rectangle
cvRectangle(src1,cvPoint(20,20),cvPoint(size.height/2,size.width/2),CV_RGB(125,125,125),2,8);
//draw circle
cvCircle(src1,cvPoint(100,100),80,CV_RGB(255,0,0),2,8);
//draw ellipse
cvEllipse(src1,cvPoint(150,150),cvSize(40,80),30,0,360,CV_RGB(0,255,0),2,8);
//draw ellipse inside box
CvBox2D box;
box.center=cvPoint2D32f(110,110);
box.size=cvSize2D32f(40,80);
box.angle=40;
cvEllipseBox(src1,box,CV_RGB(0,0,255),2,8);
//draw polygon
CvPoint p[]={cvPoint(100,100),cvPoint(150,150),
cvPoint(200,120),cvPoint(250,150),
cvPoint(300,100),cvPoint(250,50),
cvPoint(200,80),cvPoint(150,50)};
CvPoint** pt=new CvPoint*[1];
pt[0]=p;
int np[]={8};
cvFillPoly(src1,pt,np,1,CV_RGB(124,23,44),8);
cvFillConvexPoly(src1,p,np[0],CV_RGB(33,55,88),8);
cvPolyLine(src1,pt,np,1,1,CV_RGB(90,208,31),1,8);
//free
cvShowImage("src",src1);
cvWaitKey(0);
cvReleaseImage(&src1);
cvDestroyAllWindows();
}
F7生成解决方案,在cmd中转到.exe所在的文件夹:
运行结果: