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) 保存工程并运行,结果如下图所示:
