OpenCV  4.5.2
Open Source Computer Vision
Basic Drawing

Next Tutorial: Random generator and text with OpenCV

Original author Ana Huamán
Compatibility OpenCV >= 3.0

Goals

In this tutorial you will learn how to:

  • Draw a line by using the OpenCV function line()
  • Draw an ellipse by using the OpenCV function ellipse()
  • Draw a rectangle by using the OpenCV function rectangle()
  • Draw a circle by using the OpenCV function circle()
  • Draw a filled polygon by using the OpenCV function fillPoly()

Code

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.

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

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

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

MyLine

  • As we can see, MyLine just call the function line() , which does the following:
    • Draw a line from Point start to Point end
    • The line is displayed in the image img
    • The line color is defined by ( 0, 0, 0 ) which is the RGB value correspondent to Black
    • The line thickness is set to thickness (in this case 2)
    • The line is a 8-connected one (lineType = 8)

MyEllipse

  • From the code above, we can observe that the function ellipse() draws an ellipse such that:
    • The ellipse is displayed in the image img
    • The ellipse center is located in the point (w/2, w/2) and is enclosed in a box of size (w/4, w/16)
    • The ellipse is rotated angle degrees
    • The ellipse extends an arc between 0 and 360 degrees
    • The color of the figure will be ( 255, 0, 0 ) which means blue in BGR value.
    • The ellipse's thickness is 2.

MyFilledCircle

  • Similar to the ellipse function, we can observe that circle receives as arguments:
    • The image where the circle will be displayed (img)
    • The center of the circle denoted as the point center
    • The radius of the circle: w/32
    • The color of the circle: ( 0, 0, 255 ) which means Red in BGR
    • Since thickness = -1, the circle will be drawn filled.

MyPolygon

  • To draw a filled polygon we use the function fillPoly() . We note that:
    • The polygon will be drawn on img
    • The vertices of the polygon are the set of points in ppt
    • The color of the polygon is defined by ( 255, 255, 255 ), which is the BGR value for white

rectangle

  • Finally we have the cv::rectangle function (we did not create a special function for this guy). We note that:
    • The rectangle will be drawn on rook_image
    • Two opposite vertices of the rectangle are defined by ( 0, 7*w/8 ) and ( w, w )
    • The color of the rectangle is given by ( 0, 255, 255 ) which is the BGR value for yellow
    • Since the thickness value is given by FILLED (-1), the rectangle will be filled.

Result

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

cv::String
std::string String
Definition: cvstd.hpp:150
cv::Point_< int >
cv::rectangle
void rectangle(InputOutputArray img, Rect rec, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
cv::moveWindow
void moveWindow(const String &winname, int x, int y)
Moves the window to the specified position.
cv::Mat::zeros
static MatExpr zeros(int rows, int cols, int type)
Returns a zero array of the specified size and type.
cv::waitKey
int waitKey(int delay=0)
Waits for a pressed key.
cv::Point_::x
_Tp x
x coordinate of the point
Definition: types.hpp:186
highgui.hpp
core.hpp
cv::Size
Size2i Size
Definition: types.hpp:347
cv::line
void line(InputOutputArray img, Point pt1, Point pt2, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
Draws a line segment connecting two points.
cv::rectangle
void rectangle(InputOutputArray img, Point pt1, Point pt2, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
Draws a simple, thick, or filled up-right rectangle.
CV_8UC3
#define CV_8UC3
Definition: interface.h:90
cv::FILLED
@ FILLED
Definition: imgproc.hpp:813
cv::imshow
void imshow(const String &winname, InputArray mat)
Displays an image in the specified window.
cv::Scalar
Scalar_< double > Scalar
Definition: types.hpp:669
cv::Point
Point2i Point
Definition: types.hpp:194
cv::Mat
n-dimensional dense array class
Definition: mat.hpp:801
cv::imshow
void imshow(const String &winname, const ogl::Texture2D &tex)
Displays OpenGL 2D texture in the specified window.
cv
"black box" representation of the file storage associated with a file on disk.
Definition: affine.hpp:51
imgproc.hpp
cv::fillPoly
void fillPoly(InputOutputArray img, const Point **pts, const int *npts, int ncontours, const Scalar &color, int lineType=LINE_8, int shift=0, Point offset=Point())
cv::destroyAllWindows
void destroyAllWindows()
Destroys all of the HighGUI windows.
cv::LINE_8
@ LINE_8
8-connected line
Definition: imgproc.hpp:815
cv::fillPoly
void fillPoly(InputOutputArray img, InputArrayOfArrays pts, const Scalar &color, int lineType=LINE_8, int shift=0, Point offset=Point())
Fills the area bounded by one or more polygons.
cv::ellipse
void ellipse(InputOutputArray img, const RotatedRect &box, const Scalar &color, int thickness=1, int lineType=LINE_8)
cv::ellipse
void 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)
Draws a simple or thick elliptic arc or fills an ellipse sector.
cv::datasets::circle
@ circle
Definition: gr_skig.hpp:62
cv::circle
void circle(InputOutputArray img, Point center, int radius, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
Draws a circle.