在图像上绘制几何图形
绘制圆形circle()
OpenCV4提供了circle()函数用于绘制圆形
circle()函数原型:
void cv::circle(InputArray img,
Point center,
int radius,
const Scalar& color,
int thickness = 1,
int shift = 0
)
- img:需要绘制圆形的图像
- center:圆形的圆心位置坐标
- radius:圆形的半径,单位为像素
- color:圆形的颜色
- thickness:轮廓的宽度,如果数值为负,则绘制一个实心圆
- lineType:边界的类型,可取值为FILLED、LINE_4、LINE_8和LINE_AA
- shift:中心坐标和半径数值中的小数数位
绘制直线line()
在OpenCV中提供了line()函数用于绘制直线
line()函数原型:
void cv::line(InputOutArray img,
Point pt1,
Point pt2,
const Scalar& color,
int thickness = 1,
int lineType = LINE_8,
int shift = 0
)
- pt1:直线起点在图像中的坐标。
- pt2:直线终点在图像中的坐标。
- color:直线的颜色,用三通道表示
绘制椭圆ellipse()
在OpenCV中提供了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:椭圆弧终止的角度,单位为度
在OpenCV中还提供了另一个名为ellipse2Poly()的函数用于输出椭圆边界的像素坐标,但是不会在图像中绘制椭圆
ellipse2Poly()函数原型:
void cv::ellipse2Poly(Point center,
Size axes,
int angle,
int arcStart,
int arcEnd,
int delta,
std::vector< Point >& pts
)
- delta:后续折线顶点之间的角度,它定义了近似精度
- pts:椭圆边缘像素坐标向量集合
绘制多边形rectangle()
在OpenCV中提供了函数rectangle()函数fillPoly()用于绘制多边形
rectangle()函数原型:
void cv::rectangle(InputOutArray img,
Point pt1,
Point pt2,
const Sclar& color,
int thickness = 1,
int lineType = LINE_8,
int shift = 0
)
void cv::rectangle(InputOutArray img,
Rect rec,
const Scalar& color,
int thickness = 1,
int lineType = LINE_8,
int shift = 0
)
- pt1:矩形的一个顶点
- pt2:矩形中与pt1相对的顶点,即两个点在对角线上
- rec:矩形左上角顶点和长度
- color:直线的颜色,用三通道表示
- thickness:轮廓的宽度,如果数值为负,则绘制一个实心圆
- shift:中心坐标和半径数值中的小数数位
Rect变量,该变量在OpenCV中表示矩形的含义,与Point,Vec3b等类型相同,Rect表示的是矩形的左上角像素坐标,以及矩形的长和宽,该类型定义的格式为Rect(像素的X坐标,像素的Y坐标,矩形的宽,矩形的高)
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:每个多边形顶点数组中顶点的个数
- ncoutours:绘制多边形的个数
- offset:所有顶点的可选偏移
文字生成putText()
在OpenCV中提供了在图像生成的文字putText()函数
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只支持英文
- org:图像中文字字符的左下角像素坐标
- fontFace:字体类型的选择标志、参数取值范围及含义在下表中给出
- fontScale:字体的大小
- bottomLeftOrigin:图像数据原点的位置。默认为左上角;如果参数改为true,则原点为左下角
fontFace字体类型及含义
| 标志 | 简记 | 含义 |
|---|---|---|
| FONT_HERSHEY_SIMPLEX | 0 | 正常大小的无衬线字体 |
| FONT_HERSHEY_PLAIN | 1 | 小尺寸的无衬线字体 |
| FONT_HERSHEY_DUPLEX | 2 | 正常大小的较复杂的无衬线字体 |
| FONT_HERSHEY_COMPLEX | 3 | 正常大小的衬线字体 |
| FONT_HERSHEY_TRIPLEX | 4 | 正常大小的较复杂的衬线字体 |
| FONT_HERSHEY_COMPLEX_SMALL | 5 | 小尺寸的衬线字体 |
| FONT_HERSHEY_SCRIPT_SIMPLEX | 6 | 手写风格的字体 |
| FONT_HERSHEY_SCRIPT_COMPLEX | 7 | 复杂的手写风格字体 |
| FONT_ITALIC | 16 | 斜体字体 |
示例:
#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, 100), Point(200, 100), Scalar(255, 255, 255), 2, 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(30,20), 0), 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);
//绘制多边形
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);
waitKey(0);
return 0;
}