基本图像的绘制:
功能函数有:
1、ellipse()函数(绘制椭圆)
ellipse(img,//椭圆画到图像img上
Point(WINDOW_WIDTH/2,WINDOW_WIDTH/2),//椭圆中心点
Size(WINDOW_WIDTH/4,WINDOW_WIDTH/16),//大小位于矩形内
angle,//椭圆旋转角度
0,360,//扩展的弧度(0->360)
Scalar(255,129,0),//图形颜色-----蓝色
thickness,//eg线宽为2
lineType);//线型为8(8联通线型)
2、circle()函数(绘制实心圆)
circle(img,
center,//圆心点
WINDOW_WIDTH/32,//圆半径
Scalar(0,0,255),//圆颜色(红)
thickness,//线粗-1:实心的
lineType);//线型为8(8联通线型)
}
3、fillPoly()函数(凹多边形的绘制)---------
fillPoly(img,
ppt,//多边形定点集
npt,//要绘制的多边形的定点数
1,//绘制多边形的个数
Scalar(255,255,255),//白色
lineType);//线型为8(8联通线型)
}
4、line()函数(线的绘制)
line(img,
start,
end,//直线段的起始点
Scalar(0,0,0),//黑色
thickness,
lineType);
5、rectangle()函数--------绘制矩形
rectangle(rookImage,
Point(0,7*WINDOW_WIDTH/8),
Point(WINDOW_WIDTH,WINDOW_WIDTH),
Scalar(0,255,255),
-1,
8);
代码示例:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
#define WINDOW_NAME1 "【绘制图1】" //为窗口标题定义的宏
#define WINDOW_NAME2 "【绘制图2】" //为窗口标题定义的宏
#define WINDOW_WIDTH 600 //定义窗口大小的宏
//--------DrawEllipse()函数(绘制椭圆)---------
void DrawEllipse(Mat img,double angle)
{
int thickness = 2;
int lineType = 8;
ellipse(img,//椭圆画到图像img上
Point(WINDOW_WIDTH/2,WINDOW_WIDTH/2),//椭圆中心点
Size(WINDOW_WIDTH/4,WINDOW_WIDTH/16),//大小位于矩形内
angle,//椭圆旋转角度
0,360,//扩展的弧度(0->360)
Scalar(255,129,0),//图形颜色-----蓝色
thickness,//线宽为2
lineType);//线型为8(8联通线型)
}
//-------DrawFilledCircle()函数(绘制实心圆)---------
void DrawFilledCircle(Mat img,Point center) {
int thickness = -1;
int lineType = 8;
circle(img,
center,//圆心点
WINDOW_WIDTH/32,//圆半径
Scalar(0,0,255),//圆颜色(红)
thickness,//线粗-1:实心的
lineType);//线型为8(8联通线型)
}
//-----------DrawPolygon()函数(凹多边形的绘制)---------
void DrawPolygon(Mat img) {
int lineType = 8;
//创建一些点
Point rookPoints[1][20];
rookPoints[0][0] = Point(WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8);
rookPoints[0][1] = Point(3 * WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8);
rookPoints[0][2] = Point(3 * WINDOW_WIDTH / 4, 13 * WINDOW_WIDTH / 16);
rookPoints[0][3] = Point(11 * WINDOW_WIDTH / 16, 13 * WINDOW_WIDTH / 16);
rookPoints[0][4] = Point(19 * WINDOW_WIDTH / 32, 3 * WINDOW_WIDTH / 8);
rookPoints[0][5] = Point(3 * WINDOW_WIDTH / 4, 3*WINDOW_WIDTH / 8);
rookPoints[0][6] = Point(3 * WINDOW_WIDTH / 4, WINDOW_WIDTH / 8);
rookPoints[0][7] = Point(26 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8);
rookPoints[0][8] = Point(26 * WINDOW_WIDTH / 40, WINDOW_WIDTH /4);
rookPoints[0][9] = Point(22 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4);
rookPoints[0][10] = Point(22 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8);
rookPoints[0][11] = Point(18*WINDOW_WIDTH / 40, WINDOW_WIDTH / 8);
rookPoints[0][12] = Point(18*WINDOW_WIDTH / 40, WINDOW_WIDTH / 4);
rookPoints[0][13] = Point(14*WINDOW_WIDTH / 40, WINDOW_WIDTH / 4);
rookPoints[0][14] = Point(14*WINDOW_WIDTH / 40, WINDOW_WIDTH / 8);
rookPoints[0][15] = Point(WINDOW_WIDTH / 4, WINDOW_WIDTH / 8);
rookPoints[0][16] = Point(WINDOW_WIDTH / 4, 3 * WINDOW_WIDTH / 8);
rookPoints[0][17] = Point(13*WINDOW_WIDTH / 32, 3 * WINDOW_WIDTH / 8);
rookPoints[0][18] = Point(5*WINDOW_WIDTH / 16, 13 * WINDOW_WIDTH / 16);
rookPoints[0][19] = Point(WINDOW_WIDTH / 4, 13 * WINDOW_WIDTH / 16);
const Point*ppt[1] = {rookPoints[0]};
int npt[] = {20};
fillPoly(img,
ppt,//多边形定点集
npt,//要绘制的多边形的定点数
1,//绘制多边形的个数
Scalar(255,255,255),//白色
lineType);//线型为8(8联通线型)
}
//----------DrawLine()函数(线的绘制)------------
void DrawLine(Mat img,Point start,Point end) {
int thickness = 2;
int lineType = 8;
line(img,
start,
end,//直线段的起始点
Scalar(0,0,0),//黑色
thickness,
lineType);
}
int main(void){
//创建空白的Mat图像
Mat atomImage = Mat::zeros(WINDOW_WIDTH, WINDOW_WIDTH,CV_8UC3);
Mat rookImage = Mat::zeros(WINDOW_WIDTH, WINDOW_WIDTH, CV_8UC3);
//-----绘制化学中的原子示例图------
//先绘制椭圆
DrawEllipse(atomImage,90);
DrawEllipse(atomImage,0);
DrawEllipse(atomImage,45);
DrawEllipse(atomImage,-45);
//绘制圆心
DrawFilledCircle(atomImage,Point(WINDOW_WIDTH/2,WINDOW_WIDTH/2));
//---------绘制组合图-------
//先绘多边形
DrawPolygon(rookImage);
//绘制矩形
rectangle(rookImage,
Point(0,7*WINDOW_WIDTH/8),
Point(WINDOW_WIDTH,WINDOW_WIDTH),
Scalar(0,255,255),
-1,
8);
//绘制一些线段
DrawLine(rookImage,Point(0,15*WINDOW_WIDTH/16),Point(WINDOW_WIDTH,15*WINDOW_WIDTH/16));
DrawLine(rookImage, Point(WINDOW_WIDTH/4, 7 * WINDOW_WIDTH / 8),Point(WINDOW_WIDTH/4,WINDOW_WIDTH));
DrawLine(rookImage, Point(WINDOW_WIDTH / 2, 7 * WINDOW_WIDTH / 8), Point(WINDOW_WIDTH / 2, WINDOW_WIDTH));
DrawLine(rookImage, Point(3*WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8), Point(3*WINDOW_WIDTH / 4, WINDOW_WIDTH));
//----------显示绘制出的图像----------
imshow(WINDOW_NAME1,atomImage);
moveWindow(WINDOW_NAME1,0,200);
imshow(WINDOW_NAME2,rookImage);
moveWindow(WINDOW_NAME2,WINDOW_WIDTH,200);
waitKey (0);
return(0);
}
结果如下: