首页 > 编程笔记 > C++笔记 阅读:2

OpenCV line()函数:绘制线段(附带实例)

在 OpenCV 中,函数 Line() 用来画线段,该函数声明如下:
void cv::line ( InputOutputArray  img,
                Point  pt1,
                Point pt2,
                const Scalar & color,
                int  thickness = 1,
                int  lineType = LINE_8,
                int  shift = 0
);
各个参数的含义如下:
【实例】综合画图。
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) 保存工程并运行,结果如下图所示:

相关文章