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

OpenCV学习笔记(六):绘制几何图形

2016-07-21 15:56 441 查看
主要参考了毛星云等著《OpenCV3编程入门》学习了在OpenCV中绘制一些几何图形,包括线段、圆形、矩形、椭圆形、多边形等。由于代码比较简单,直接上代码了,相信大家应该可以看懂。

#include<opencv2/opencv.hpp>
using namespace cv;
#define WINDOW_WIDTH 400

void DrawEllipse(Mat img, double angle); //画椭圆形
void DrawCircle(Mat img, Point center); //画圆形
void DrawPolygon(Mat img); //画凹多边形
void DrawLine(Mat img, Point start, Point end); //画线段

int main()
{
Mat srcimg = Mat::zeros(WINDOW_WIDTH, WINDOW_WIDTH, CV_8UC3);
Mat dstimg = Mat::zeros(WINDOW_WIDTH, WINDOW_WIDTH, CV_8UC3);

//画椭圆形
DrawEllipse(srcimg, 90);
//画圆形
Point center(srcimg.cols / 2, srcimg.rows / 2);
DrawCircle(srcimg, center);
//画凹多边形
DrawPolygon(dstimg);
//画线段
Point start(30, 30), end(200, 200);
DrawLine(srcimg, start, end);
//画矩形
rectangle(srcimg,
Point(0, 100),
Point(50, 200),
Scalar(0, 255, 255),
-1,
8);

imshow("srcimg", srcimg);
imshow("dstimg", dstimg);
waitKey(0);
return 0;
}

//画椭圆形
void DrawEllipse(Mat img, double angle)
{
int thickness = -2; //当thickness<0时,为实心,大于0时为空心。
int lineType = 8;

ellipse(img,
Point(img.rows / 2, img.cols / 2),
Size(img.rows / 4, img.cols / 16),
angle,
0,
360,
Scalar(255, 129, 0),
thickness,
lineType
);
}

//画圆形
void DrawCircle(Mat img, Point center)
{
int thickness = 50;
int lineType = 8;

circle(img,
center,
img.rows / 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, 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 );
}

//画线段
void DrawLine(Mat img, Point start, Point end)
{
int thickness = 2;
int lineType = 8;
line(img,
start,
end,
Scalar(255, 255, 255),
thickness,
lineType);
}

最终结果如下:

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