【OpenCV】绘制简单图形

这篇博客介绍了如何利用OpenCV库在Python中绘制线条、椭圆、矩形、圆形和多边形,并提供了相应的代码示例,展示了运行结果。

线条、椭圆、矩形、圆、多边形

线条line()

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

椭圆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 ) 

矩形rectangle() 

void cv::rectangle  (   InputOutputArray    img,
                        Point   pt1,
                        Point   pt2,
                        const Scalar &  color,
                        int     thickness = 1,
                        int     lineType = LINE_8,
                        int     shift = 0 ) 

圆circle()

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

多边形fillPoly()

void cv::fillPoly   (   Mat &   img,
                        const Point **  pts,
                        const int *     npts,
                        int     ncontours,
                        const Scalar &  color,
                        int     lineType = LINE_8,
                        int     shift = 0,
                        Point   offset = Point() )  

代码示例

#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 MyRect(Mat img);
void MyLine(Mat img, Point start, Point end);

int main(void)
{

    Mat atom_image = Mat::zeros(w, w, CV_8UC3);
    Mat rook_image = Mat::zeros(w, w, CV_8UC3);

    MyEllipse(atom_image, 90);                                          // 椭圆
    MyEllipse(atom_image, 0);
    MyEllipse(atom_image, 45);
    MyEllipse(atom_image, -45);

    MyFilledCircle(atom_image, Point(w / 2, w / 2));                    // 圆

    MyPolygon(rook_image);                                              // 多边形

    MyRect(rook_image);                                                 // 矩形

    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));

    char atom_window[] = "Drawing 1:Atom";
    char rook_window[] = "Drawing 2:Rook";
    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);
}

void MyPolygon(Mat img)
{
    int lineType = LINE_8;
    Point rook_points[1][20];
    rook_points[0][0] = Point(w / 4, 7 * w / 8);
    rook_points[0][1] = Point(3 * w / 4, 7 * w / 8);
    rook_points[0][2] = Point(3 * w / 4, 13 * w / 16);
    rook_points[0][3] = Point(11 * w / 16, 13 * w / 16);
    rook_points[0][4] = Point(19 * w / 32, 3 * w / 8);
    rook_points[0][5] = Point(3 * w / 4, 3 * w / 8);
    rook_points[0][6] = Point(3 * w / 4, w / 8);
    rook_points[0][7] = Point(26 * w / 40, w / 8);
    rook_points[0][8] = Point(26 * w / 40, w / 4);
    rook_points[0][9] = Point(22 * w / 40, w / 4);
    rook_points[0][10] = Point(22 * w / 40, w / 8);
    rook_points[0][11] = Point(18 * w / 40, w / 8);
    rook_points[0][12] = Point(18 * w / 40, w / 4);
    rook_points[0][13] = Point(14 * w / 40, w / 4);
    rook_points[0][14] = Point(14 * w / 40, w / 8);
    rook_points[0][15] = Point(w / 4, w / 8);
    rook_points[0][16] = Point(w / 4, 3 * w / 8);
    rook_points[0][17] = Point(13 * w / 32, 3 * w / 8);
    rook_points[0][18] = Point(5 * w / 16, 13 * w / 16);
    rook_points[0][19] = Point(w / 4, 13 * w / 16);
    const Point* ppt[1] = { rook_points[0] };
    int npt[] = { 20 };
    fillPoly(img,
        ppt,
        npt,
        1,
        Scalar(255, 255, 255),
        lineType);
}

void MyRect(Mat img)
{
    rectangle(img,
        Point(0, 7 * w / 8),
        Point(w, w),
        Scalar(0, 255, 255),
        FILLED,
        LINE_8);
}

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);
}


运行结果


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值