OpenCV line()函数:绘制线段(附带实例)
在 OpenCV 中,函数 Line() 用来画线段,该函数声明如下:
【实例】综合画图。
1) 打开 Qt Creator,新建一个控制台工程,工程名是 test。
2) 在 IDE 中打开 main.cpp,输入如下代码:
3) 保存工程并运行,结果如下图所示:
void cv::line ( InputOutputArray img,
Point pt1,
Point pt2,
const Scalar & color,
int thickness = 1,
int lineType = LINE_8,
int shift = 0
);
各个参数的含义如下:
- img 表示输入的图像(线段画在这个图像上);
- pt1 表示线段的起始点;
- pt2 表示线段的结束点;
- color 表示线段颜色;
- thickness 表示线段粗细;
- lineType 表示线段类型;
- shift 表示点坐标中的小数位数。
【实例】综合画图。
1) 打开 Qt Creator,新建一个控制台工程,工程名是 test。
2) 在 IDE 中打开 main.cpp,输入如下代码:
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#define w 400
using namespace cv;
/* 函数声明 */
void MyEllipse(Mat img, double angle);
void MyFilledCircle(Mat img, Point center);
void MyPolygon(Mat img);
void MyLine(Mat img, Point start, Point end);
/* 主函数 */
int main(void)
{
const char atom_window[] = "Drawing 1: Atom";
const char rook_window[] = "Drawing 2: Rook";
/* 创建两幅空白图像 */
Mat atom_image = Mat::zeros(w, w, CV_8UC3);
Mat rook_image = Mat::zeros(w, w, CV_8UC3);
/* 绘制 Atom 图像 */
MyEllipse(atom_image, 90);
MyEllipse(atom_image, 0);
MyEllipse(atom_image, 45);
MyEllipse(atom_image, -45);
MyFilledCircle(atom_image, Point(w / 2, w / 2));
/* 绘制 Rook 图像 */
MyPolygon(rook_image);
/* 绘制 Rook 基座和线条 */
rectangle(rook_image,
Point(0, 7 * w / 8),
Point(w, w),
Scalar(0, 255, 255),
FILLED,
LINE_8);
MyLine(rook_image, Point(0, 15 * w / 16), Point(w, 15 * w / 16));
MyLine(rook_image, Point(w / 4, 7 * w / 8), Point(w / 4, w));
MyLine(rook_image, Point(w / 2, 7 * w / 8), Point(w / 2, w));
MyLine(rook_image, Point(3 * w / 4, 7 * w / 8), Point(3 * w / 4, w));
/* 显示两幅窗口 */
imshow(atom_window, atom_image);
moveWindow(atom_window, 0, 200);
imshow(rook_window, rook_image);
moveWindow(rook_window, w, 200);
waitKey(0);
return 0;
}
/* 绘制椭圆 */
void MyEllipse(Mat img, double angle)
{
int thickness = 2;
int lineType = 8;
ellipse(img,
Point(w / 2, w / 2),
Size(w / 4, w / 16),
angle,
0,
360,
Scalar(255, 0, 0),
thickness,
lineType);
}
/* 绘制填充圆 */
void MyFilledCircle(Mat img, Point center)
{
circle(img,
center,
w / 32,
Scalar(0, 0, 255),
FILLED,
LINE_8);
}
/* 绘制多边形(Rook) */
void MyPolygon(Mat img)
{
int lineType = LINE_8;
/* 定义 20 个顶点 */
Point rook_points[1][20] = {
{
Point(w / 4, 7 * w / 8),
Point(3 * w / 4, 7 * w / 8),
Point(3 * w / 4, 13 * w / 16),
Point(11 * w / 16, 13 * w / 16),
Point(19 * w / 32, 3 * w / 8),
Point(3 * w / 4, 3 * w / 8),
Point(3 * w / 4, w / 8),
Point(26 * w / 40, w / 8),
Point(26 * w / 40, w / 4),
Point(22 * w / 40, w / 4),
Point(22 * w / 40, w / 8),
Point(18 * w / 40, w / 8),
Point(18 * w / 40, w / 4),
Point(14 * w / 40, w / 4),
Point(14 * w / 40, w / 8),
Point(w / 4, w / 8),
Point(w / 4, 3 * w / 8),
Point(13 * w / 32, 3 * w / 8),
Point(5 * w / 16, 13 * w / 16),
Point(w / 4, 13 * w / 16)
}
};
const Point* ppt[1] = { rook_points[0] };
int npt[1] = { 20 };
fillPoly(img, ppt, npt, 1, Scalar(255, 255, 255), lineType);
}
/* 绘制线段 */
void MyLine(Mat img, Point start, Point end)
{
int thickness = 2;
int lineType = LINE_8;
line(img, start, end, Scalar(0, 0, 0), thickness, lineType);
}
在上述代码中,我们分别进行了画椭圆、画矩形、填充多边形和画线段的操作。3) 保存工程并运行,结果如下图所示:

ICP备案:
公安联网备案: