1. 绘制圆形
1.1 circle()函数原型
void cv::circle(InputOutputArray img, Point center, int radius, const Scalar & color,
int thickness = 1, int lineType = LINE_8, int shift = 0 )
img:需要绘制圆形的图像。
center:圆形的圆心位置坐标。
radius:圆形的半径,单位为像素。
color:圆形的颜色。
thickness:轮廓的宽度,如果数值为负,则绘制一个实心圆。
lineType:边界的类型,可取值为 FILLED、LINE_4、LINE_8 和 LINE_AA。
shift:中心坐标和半径数值中的小数位数。
该函数用于在一幅图像中绘制圆形图案,输入的参数分别是圆形的圆心位置、半径,以及边界线的宽度和线型。
2. 绘制直线
2.1 line()函数原型
void cv::line(InputOutputArray img, Point pt1, Point pt2, const Scalar & color,
int thickness = 1, int lineType = LINE_8, int shift = 0 )
pt1:直线起点在图像中的坐标。
pt2:直线终点在图像中的坐标。
color:直线的颜色,用三通道表示。
3. 绘制椭圆
3.1 ellipse()函数原型
void cv::ellipse(InputOutputArray img, Point center, Size axes, double angle, double startAngle,
double endAngle, const Scalar & color, int thickness = 1, int lineType = LINE_8, int shift = 0 )
center :椭圆的中心坐标。axes:椭圆的长半轴和短半轴的长度 。angle :椭圆旋转的角度,单位为度。startAngle :椭圆弧起始的角度,单位为度。endAngle :椭圆弧终止的角度,单位为度
3.2 ellipse2Poly()函数原型
void cv::ellipse2Poly(Point center,
Size axes,
int angle,
int arcStart,
int arcEnd,
int delta,
std::vector< Point > & pts
)
arcStart:椭圆孤起始的角度,单位为度。
arcEnd:椭圆弧终止的角度,单位为度。
delta:点与点之间的角度分辨率,其实就是对椭圆曲线的近似度。
pts:椭圆边缘像素坐标向量集合。
4. 绘制多边形
4.1 rectangle()函数原型
void cv::rectangle(InputOutputArray img,
Point pt1,
Point pt2,
const Scalar & color,
int thickness = 1,
int lineType = LINE_8,
int shift = 0
)
void cv::rectangle(InputOutputArray img,
Rect rec,
const Scalar & color,
int thickness = 1,
int lineType = LINE_8,
int shift = 0
)
pt1:矩形的一个顶点。
pt2:矩形中与 pt1 相对的顶点,即两个点在对角线上。
rec:矩形左上角顶点和长宽。
在 OpenCV 4 中定义了两种函数原型,分别利用矩形对角线上两个顶点的坐标或者利用左上角顶点坐标与矩形的长和宽唯一地确定一个矩形。在绘制矩形时,同样可以控制边缘线的宽度绘制一个实心的矩形。
这里我们详细介绍 Rect 变量,该变量在 OpenCV 4中表示矩形的含义,与 Point、Vec3b 等类型相同,都是在图像处理中常用的类型。Rect 表示的是矩形的左上角像素坐标,以及矩形的长和宽,该类型定义的格式为 Rect(像素的 x 坐标,像素的 y 坐标,矩形的宽,矩形的高),其中可以存 放的数据类型也分别为 int 型(Rect2i 或者 Rect)、double 类型(Rect2d)和 float 类型(Rect2f)。
4.3 fillPoly()函数原型
void cv::fillPoly(InputOutputArray img,
const Point ** pts,
const int * npts,
int ncontours,
const Scalar & color,
int lineType = LINE_8,
int shift = 0,
Point offset = Point()
)
pts:多边形顶点数组,可以存放多个多边形的顶点坐标的数组。
npts:每个多边形顶点数组中顶点的个数。
ncontours:绘制多边形的个数。
offset:所有顶点的可选偏移。
5. 文字生成
5.1 putText()函数原型
void cv::putText(InputOutputArray img,
const String & text,
Point org,
int fontFace,
double fontScale,
Scalar color,
int thickness = 1,
int lineType = LINE_8,
bool bottomLeftOrigin = false
)
text:输出到图像中的文字,目前 OpenCV 4 只支持英文。
org:图像中文字字符串的左下角像素坐标。
fontFace:字体类型的选择标志、参数取值范围及含义在表 3-8 中给出。
fontScale:字体的大小。
bottomLeftOrigin:图像数据原点的位置。默认为左上角;如果参数改为 true,则原点为左下角。
6. RotatedRect函数介绍
RotatedRect(const Point2f& center, const Size2f& size, float angle);
center | 旋转矩形的质心 |
size | 旋转矩形的宽度和高度 |
angle | 顺时针方向的旋转角度。当角度为0°,90°,180°,270°等时,矩形变为右上方的矩形 |
RotatedRect(const Point2f& point1, const Point2f& point2, const Point2f& point3);
矩形的任意三个点。注意必须遵从逆时针或顺时针的顺序
7.代码示例
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img = Mat::zeros(Size(512, 512), CV_8UC3); //生成一个黑色图像用于绘制几何图形
//绘制圆形
circle(img, Point(50, 50), 25, Scalar(255, 255, 255), -1); //绘制一个实心圆
circle(img, Point(100, 50), 20, Scalar(255, 255, 255), 4); //绘制一个空心圆
//绘制直线
line(img, Point(100, 150), Point(200, 150), Scalar(255, 255, 255), 1, LINE_8,0);
line(img, Point(100, 200), Point(200, 200), Scalar(255, 255, 255), 1, LINE_4,0);
//绘制椭圆
ellipse(img, Point(300,255), Size(100, 70), 0, 0, 100, Scalar(255,255,255), -1);
ellipse(img, RotatedRect(Point2f(150,100), Size2f(60,20), 90), Scalar(0,0,255),2);
vector<Point> points;
//用一些点来近似一个椭圆
ellipse2Poly(Point(200, 400), Size(100, 70),0,0,360,2,points);
for (int i = 0; i < points.size()-1; i++) //用直线把这个椭圆画出来
{
if (i==points.size()-1)
{
//椭圆最后一个点与第一个点连线
line(img, points[0], points[i], Scalar(255, 255, 255), 2);
break;
}
//当前点与后一个点连线
line(img, points[i], points[i+1], Scalar(255, 255, 255), 2);
}
//绘制矩形
rectangle(img, Point(50, 400), Point(100, 450), Scalar(125, 125, 125), -1); //实心
rectangle(img, Rect(400,450,60,50), Scalar(0, 125, 125), 2);
RotatedRect rRect = RotatedRect(Point2f(100, 100), Size2f(100, 50), 150);
//绘制旋转矩形
Point2f vertices[4];
rRect.points(vertices);
for (int i = 0; i < 4; i++)
line(img, vertices[i], vertices[(i + 1) % 4], Scalar(0, 255, 0), 2);
RotatedRect rRect_1 = RotatedRect(Point2f(100, 100), Point2f(100, 150), Point2f(200,150));
Point2f vertices_1[3];
rRect_1.points(vertices_1);
for (int i = 0; i < 3; i++)
line(img, vertices_1[i], vertices_1[(i + 1) % 3], Scalar(0, 255, 0), 2);
//绘制多边形
Point pp[2][6];
pp[0][0] = Point(72, 200);
pp[0][1] = Point(142, 204);
pp[0][2] = Point(226, 263);
pp[0][3] = Point(172, 310);
pp[0][4] = Point(117, 319);
pp[0][5] = Point(15, 260);
pp[1][0] = Point(359, 339);
pp[1][1] = Point(447, 351);
pp[1][2] = Point(504, 349);
pp[1][3] = Point(484, 433);
pp[1][4] = Point(418, 449);
pp[1][5] = Point(354, 402);
Point pp2[5];
pp2[0] = Point(350, 83);
pp2[1] = Point(463, 90);
pp2[2] = Point(500, 171);
pp2[3] = Point(421, 194);
pp2[4] = Point(338, 141);
const Point* pts[3] = { pp[0],pp[1],pp2 }; //pts 变量的生成
int npts[] = { 6,6,5 }; //顶点个数数组的生成
fillPoly(img, pts, npts, 3, Scalar(125, 125, 125),8); //绘制 3 个多边形
//生成文字
putText(img, "Learn OpenCV 4",Point(100, 400), 2, 1, Scalar(255, 255, 255));
imshow("img", img);
waitKey(0);
return 0;
}