#define WINDOW_WIDTH 600
#define WINDOW_NAME1 "绘图1"
#define WINDOW_NAME2 "绘图2"
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
void DrawEllipse(Mat img,double angle){
int thickness=2;//线宽为2
int linetype=8;//线型为8--联通线型
ellipse(img, Point(WINDOW_WIDTH/2,WINDOW_WIDTH/2), Size(WINDOW_WIDTH/4,WINDOW_WIDTH/16),angle, 0, 360, Scalar(255,199,0),thickness,linetype);
//ellipse是一个绘制图像的opencv函数,将绘制好的图像存放到img中,第一个参数是存放图像的名称,第二个参数表示从整个窗口的中心点开始绘制,第三个参数表示绘制图像的大小,是一个矩形区域,第4,5,6参数表示旋转角度,扩展弧度从0到360度,第7个参数表示颜色,这里是蓝色,注:Scalar函数的顺序是BGR而不是RGB。第8个参数是线宽,第9个参数是线的类型。
}
void DrawFilledCircle(Mat img,Point center){
int thickness=-1;
int linetype=8;
circle(img, center, WINDOW_WIDTH/32, Scalar(0,0,255),thickness,linetype);//绘制一个红色的实心圆
}
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,WINDOW_WIDTH/8);
rookPoints[0][17]=Point(13*WINDOW_WIDTH/32,WINDOW_WIDTH/8);
rookPoints[0][18]=Point(5*WINDOW_WIDTH/16,WINDOW_WIDTH/16);
rookPoints[0][19]=Point(WINDOW_WIDTH/4,WINDOW_WIDTH/16);
const Point* ppt[1]={rookPoints[0]};
int npt[]={20};
fillPoly(img, ppt, npt, 1, Scalar(255,255,255),linetype);
}
void DrawLine(Mat img,Point start,Point end){
int thickness=2;
int linetype=8;
line(img, start, end, Scalar(0,0,0),thickness,linetype);//在img上画一条从点start到点end的黑色直线段
}
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;
}