OpenCV的基本图像绘制函数主要包括:
- 用于绘制直线的line函数
- 用于绘制椭圆的ellipse函数
- 用于绘制矩形的rectangle函数
- 用于绘制圆的circle函数
- 用于绘制填充的多边形的fillPoly函数
可以通过具体的代码实例学习OpenCV各种绘制函数的用法。
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
//定义一下辅助宏
#define WINDOW_NAME "图1"
#define WINDOW_WIDTH 600
void DrawEllipse( Mat img, double angle);
void DrawFilledCircle(Mat img, Point centor);
void DrawPolygon(Mat img);
void DrawLine(Mat img, Point start, Point end);
int main() {
// 创建空白的Mat图像
Mat atomImage = Mat::zeros(WINDOW_WIDTH, WINDOW_WIDTH, CV_8UC3);
// 这里是画了4个椭圆,采用ellipse函数
DrawEllipse(atomImage, 90);
DrawEllipse(atomImage, 0);
DrawEllipse(atomImage, 45);
DrawEllipse(atomImage, -45);
// 画填充圆
DrawFilledCircle(atomImage, Point(WINDOW_WIDTH/2, WINDOW_WIDTH/2));
// 画多边形,这里以三角形为例
DrawPolygon(atomImage);
// 画矩形,参数:图像,左上角,右下角,颜色,线型(-1表示实心填充)
rectangle(atomImage,
Point(WINDOW_WIDTH/4, WINDOW_WIDTH/4),
Point(WINDOW_WIDTH*2/4, WINDOW_WIDTH*2/4),
Scalar(0, 255, 255),
5);
// 画直线,参数:图像,起始点,结束点
DrawLine(atomImage, Point(WINDOW_WIDTH/3, WINDOW_WIDTH/2), Point(WINDOW_WIDTH*2/3, WINDOW_WIDTH/2));
imshow(WINDOW_NAME, atomImage);
waitKey(0);
return 0;
}
void DrawEllipse( Mat img, double angle){
int thickness = 2;
int linetype = 8;
// 使用ellipse函数画椭圆,参数:图像,中心位置,大小,旋转角度,颜色,线宽,线型
ellipse(img,
Point(WINDOW_WIDTH/2, WINDOW_WIDTH/2),
Size(WINDOW_WIDTH/4, WINDOW_WIDTH/16),
angle, 0, 360, Scalar(255, 129, 0),
thickness, linetype);
}
void DrawFilledCircle(Mat img, Point center){
int thickness = -1;
int lineType = 8;
// 画填充圆,参数:图像, 圆心,半径,颜色,线宽
// thickness = -1,因此是实心
circle(img, center,
WINDOW_WIDTH / 32,
Scalar(0, 0, 255),
thickness, lineType);
}
void DrawPolygon(Mat img){
int lineType = 8;
// 定义points,包含3个点
Point_<int> points[1][3];
points[0][0] = Point(WINDOW_WIDTH/2, WINDOW_WIDTH/3);
points[0][1] = Point(WINDOW_WIDTH/3, WINDOW_WIDTH*2/3);
points[0][2] = Point(WINDOW_WIDTH*2/3, WINDOW_WIDTH*2/3);
const Point* ppt[1] = {points[0]};
int npt[] = {3};
// 画多边形,参数:图像,点,点的个数,颜色,线型
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);
}
结果: