图形绘制

line画线函数

1
2
3
4
5
6
void cv::line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color, 
int thickness = 1, int lineType = LINE_8, int shift = 0)

// 参数解释:输入图形、Point起点、终点、Scalar颜色、粗细
// lineType为连接线类型(默认八方向线LINE_8),抗锯齿可使用LINE_AA
// shift代表坐标缩放(除以2的shift次方)

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(){
Mat img;
img.create(Size(800,600),CV_8UC3); //create构造,不会初始化数据为0
img.setTo(255); //必须手动初始化,创建一张800*600白底

//简单用法:三点两线
Point p1(100,100);
Point p2(200,200);
Point p3(400,600);
line(img,p1,p2,Scalar(0,0,255),2); //BGR,红线
line(img,p2,p3,Scalar(0,255,0),5); //绿线

//完整调用:
Point pd1(500,21);
Point pd2(100,510);
line(img,pd1,pd2,Scalar(255,0,0),2,LINE_8,0); //蓝线
line(img,pd1,pd2,Scalar(255,255,0),2,LINE_8,1); //缩放青线

//显示坐标
string pd1text = "("+to_string(pd1.x)+","+to_string(pd1.y)+")";
string pd2text = "("+to_string(pd2.x)+","+to_string(pd2.y)+")";
putText(img,pd1text,pd1,FONT_HERSHEY_SIMPLEX,0.5,Scalar(255,0,0)); //类型FONT_HERSHEY_SIMPLEX
putText(img,pd2text,pd2,FONT_HERSHEY_SIMPLEX,1,Scalar(255,0,0));

imshow("raw",img);

waitKey(0);
destroyAllWindows();

return 0;
}

效果: 线段效果

circle画圆函数

1
2
3
4
5
6
// void cv::circle(InputOutputArray img, Point center, int radius, 
// const Scalar& color,int thickness = 1, int lineType = LINE_8,
// int shift = 0)

Point p(100,100);
circle(img,p,100,Scalar(0,0,255)); //圆心p,半径100

效果: 画圆效果

rectangle画矩形函数

1
2
3
4
5
6
7
8
9
void rectangle(cv::InputOutputArray img, cv::Rect rec, const cv::Scalar &color, 
int thickness = 1, int lineType = 8, int shift = 0)

//其中Rect对象:
Rect_(int _x, int _y, int _width, int _height); //矩形左上角坐标、长、高

//例子:
Rect rct(0,0,300,400,); //左上角坐标(0,0),长300,高400;
rectangle(img,rct,Scalar(0,0,255),1,LINE_AA); //粗细为1,抗锯齿连接

ellipse画椭圆函数

ellipse存在重载版本,可从椭圆本身的定义(中心点、ab轴长、旋转角度)出发:

1
2
3
4
5
6
7
8
9
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)

//例子:
Point p(100,50);
circle(img,p,1,Scalar(0,0,255),3); //绘图:假装中心点
//ellipse:中心点p,半长轴a长度100,半短轴b长度50,旋转角度0、起始角度0,终止角度270°
ellipse(img,p,Size(100,50),0,0,270,Scalar(0,0,255));
效果: 画椭圆效果 此外,另一个版本是从矩形出发,因为每一个椭圆都可以对应一个外接矩形,这里需要涉及一种以中心点旋转的矩形类RotatedRect,它和前文提到的Rect不同,它接受的参数是矩形中心点、长度、高度以及旋转角度,以绘制带旋转角度的矩形,通过这个矩形可内接椭圆:
1
2
3
4
5
6
7
8
9
//第二个重载版本:
void ellipse(cv::InputOutputArray img, const cv::RotatedRect &box, const cv::Scalar &color,
int thickness = 1, int lineType = 8)

//例子:
Point p1(100,100);
circle(img,p1,1,Scalar(0,0,255),3);//假装中心点
RotatedRect rorct(p1,Size(200,100),0); //p1为中心点,长200,高100的矩形,旋转0度
ellipse(img,rorct,Scalar(0,0,255)); //内接椭圆
只是这种重载无法约定起始角度和终止角度。 画椭圆效果

参考链接:

  1. https://blog.csdn.net/wwxy1995/article/details/82887179