Loading web-font TeX/Math/Italic
OpenCV  
Open Source Computer Vision
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Basic Drawing

Next Tutorial: Random generator and text with OpenCV

Goals

In this tutorial you will learn how to:

OpenCV Theory

For this tutorial, we will heavily use two structures: cv::Point and cv::Scalar :

Point

It represents a 2D point, specified by its image coordinates x and y. We can define it as:

Point pt;
pt.x = 10;
pt.y = 8;

or

Point pt = Point(10, 8);

Scalar

  • Represents a 4-element vector. The type Scalar is widely used in OpenCV for passing pixel values.
  • In this tutorial, we will use it extensively to represent BGR color values (3 parameters). It is not necessary to define the last argument if it is not going to be used.
  • Let's see an example, if we are asked for a color argument and we give:
    Scalar( a, b, c )
    We would be defining a BGR color such as: Blue = a, Green = b and Red = c

Code

  • This code is in your OpenCV sample folder. Otherwise you can grab it from here
    #include <opencv2/core.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 ){
    char atom_window[] = "Drawing 1: Atom";
    char rook_window[] = "Drawing 2: Rook";
    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 );
    rectangle( rook_image,
    Point( 0, 7*w/8 ),
    Point( w, w),
    Scalar( 0, 255, 255 ),
    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 ),
    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 MyLine( Mat img, Point start, Point end )
    {
    int thickness = 2;
    int lineType = LINE_8;
    line( img,
    start,
    end,
    Scalar( 0, 0, 0 ),
    thickness,
    lineType );
    }

Explanation

Since we plan to draw two examples (an atom and a rook), we have to create two images and two windows to display them.

char atom_window[] = "Drawing 1: Atom";
char rook_window[] = "Drawing 2: Rook";
Mat atom_image = Mat::zeros( w, w, CV_8UC3 );
Mat rook_image = Mat::zeros( w, w, CV_8UC3 );

We created functions to draw different geometric shapes. For instance, to draw the atom we used MyEllipse and MyFilledCircle:

MyEllipse( atom_image, 90 );
MyEllipse( atom_image, 0 );
MyEllipse( atom_image, 45 );
MyEllipse( atom_image, -45 );
MyFilledCircle( atom_image, Point( w/2, w/2) );

And to draw the rook we employed MyLine, rectangle and a MyPolygon:

MyPolygon( rook_image );
rectangle( rook_image,
Point( 0, 7*w/8 ),
Point( w, w),
Scalar( 0, 255, 255 ),
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 ) );

Let's check what is inside each of these functions:

MyLine

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

MyEllipse

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

MyFilledCircle

void MyFilledCircle( Mat img, Point center )
{
circle( img,
center,
w/32,
Scalar( 0, 0, 255 ),
LINE_8 );
}

MyPolygon

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

rectangle

rectangle( rook_image,
Point( 0, 7*w/8 ),
Point( w, w),
Scalar( 0, 255, 255 ),
LINE_8 );

Result

Compiling and running your program should give you a result like this:

Drawing_1_Tutorial_Result_0.png