opencv 源码 Drawing_1.cpp

/**
* @file Drawing_1.cpp
* @brief Simple geometric drawing
* @author OpenCV team
*/
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>

#define w 400

using namespace cv;

/// Function headers
void MyEllipse(Mat img, double angle);
void MyFilledCircle(Mat img, Point center);
void MyPolygon(Mat img);
void MyLine(Mat img, Point start, Point end);

/**
* @function main
* @brief Main function
*/
int main(void) {

    //![create_images]
    /// Windows names
    char atom_window[] = "Drawing 1: Atom";
    char rook_window[] = "Drawing 2: Rook";

    /// Create black empty images
    Mat atom_image = Mat::zeros(w, w, CV_8UC3);   //用zeros()初始Mat
    Mat rook_image = Mat::zeros(w, w, CV_8UC3);
    //![create_images]

    /// 1. Draw a simple atom:
    /// -----------------------

    //![draw_atom]
    /// 1.a. Creating ellipses
    MyEllipse(atom_image, 90);  //调用四次椭圆函数画出图形边界
    MyEllipse(atom_image, 0);
    MyEllipse(atom_image, 45);
    MyEllipse(atom_image, -45);

    /// 1.b. Creating circles
    MyFilledCircle(atom_image, Point(w / 2, w / 2));   //画圆心
    //![draw_atom]

    /// 2. Draw a rook
    /// ------------------

    //![draw_rook]
    /// 2.a. Create a convex polygon
    MyPolygon(rook_image);  //多边形

    //![rectangle]
    /// 2.b. Creating rectangles
    rectangle(rook_image,    //矩形函数 void cvRectangle( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color,int thickness = 1, int line_type = 8, int shift = 0);
        Point(0, 7 * w / 8),
        Point(w, w),
        Scalar(0, 255, 255),
        FILLED,
        LINE_8);
    //![rectangle]

    /// 2.c. Create a few lines
    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));
    //![draw_rook]

    /// 3. Display your stuff!
    imshow(atom_window, atom_image);
    moveWindow(atom_window, 0, 200); //
    imshow(rook_window, rook_image);
    moveWindow(rook_window, w, 200);

    waitKey(0);
    return(0);
}

/// Function Declaration

/**
* @function MyEllipse
* @brief Draw a fixed-size ellipse with different angles
*/
//![my_ellipse]
void MyEllipse(Mat img, double angle)
{
    int thickness = 2;
    int lineType = 8;

    ellipse(img,  //调用opencv的椭圆函数 void cvEllipse( CvArr* img, CvPoint center, CvSize axes, double angle,double start_angle, double end_angle, CvScalar color,int thickness = 1, int line_type = 8, int shift = 0);
        Point(w / 2, w / 2),
        Size(w / 4, w / 16),
        angle,
        0,
        360,
        Scalar(255, 0, 0),
        thickness,
        lineType);
}
//![my_ellipse]

/**
* @function MyFilledCircle
* @brief Draw a fixed-size filled circle
*/
//![my_filled_circle]
void MyFilledCircle(Mat img, Point center)
{
    circle(img,     //调用opencv圆函数 cvCircle(CvArr* img, CvPoint center, int radius, CvScalar color, int thickness=1, int lineType=8, int shift=0)
        center,
        w / 32,
        Scalar(0, 0, 255),  //BGR 255红色
        FILLED,
        LINE_8);
}
//![my_filled_circle]

/**
* @function MyPolygon
* @brief Draw a simple concave polygon (rook)
*/
//![my_polygon]
void MyPolygon(Mat img)
{
    int lineType = LINE_8; // 直线类型 好像8很常用

    /** Create some points */
    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, // 填充多边形函数     void cvFillPoly(CvArr * img , CvPoint ** pts , int * npts,    int contours ,    CvScalar color,int line_type = 8);
        ppt,
        npt,
        1,
        Scalar(255,255,255),
        lineType);
}
//![my_polygon]

/**
* @function MyLine
* @brief Draw a simple line
*/
//![my_line]
void MyLine(Mat img, Point start, Point end)
{
    int thickness = 2;
    int lineType = LINE_8;

    line(img,   //opencv直线函数  void line(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0)
        start,
        end,
        Scalar(0, 0, 0),
        thickness,
        lineType);
}
//![my_line]
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值