https://docs.opencv.org/4.3.0/df/d61/tutorial_random_generator_and_text.html
Goals
In this tutorial you will learn how to:
- Use the Random Number generator class (cv::RNG ) and how to get a random number from a uniform distribution.
- Display text on an OpenCV window by using the function cv::putText
Code
- In the previous tutorial (Basic Drawing) we drew diverse geometric figures, giving as input parameters such as coordinates (in the form of cv::Point), color, thickness, etc. You might have noticed that we gave specific values for these arguments.
- In this tutorial, we intend to use random values for the drawing parameters. Also, we intend to populate our image with a big number of geometric figures. Since we will be initializing them in a random fashion, this process will be automatic and made by using loops .
//#include <opencv2/core/core.hpp>
//#include<opencv2/imgproc/imgproc.hpp>
//#include <opencv2/highgui/highgui.hpp>
//#define w 400
//using namespace cv;
/**
* @file Drawing_2.cpp
* @brief Simple sample code
*/
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <stdio.h>
using namespace cv;
/// Global Variables
const int NUMBER = 100;
const int DELAY = 5;
const int window_width = 900;
const int window_height = 600;
int x_1 = -window_width / 2;
int x_2 = window_width * 3 / 2;
int y_1 = -window_width / 2;
int y_2 = window_width * 3 / 2;
/// Function headers
static Scalar randomColor(RNG& rng);
int Drawing_Random_Lines(Mat image, char* window_name, RNG rng);
int Drawing_Random_Rectangles(Mat image, char* window_name, RNG rng);
int Drawing_Random_Ellipses(Mat image, char* window_name, RNG rng);
int Drawing_Random_Polylines(Mat image, char* window_name, RNG rng);
int Drawing_Random_Filled_Polygons(Mat image, char* window_name, RNG rng);
int Drawing_Random_Circles(Mat image, char* window_name, RNG rng);
int Displaying_Random_Text(Mat image, char* window_name, RNG rng);
int Displaying_Big_End(Mat image, char* window_name, RNG rng);
/**
* @function main
*/
int main(void)
{
int c;
/// Start creating a window
char window_name[] = "Drawing_2 Tutorial";
/// Also create a random object (RNG)
//RNG rng(0xFFFFFFFF);
RNG rng(0);
/// Initialize a matrix filled with zeros
Mat image = Mat::zeros(window_height, window_width, CV_8UC3);
/// Show it in a window during DELAY ms
imshow(window_name, image);
waitKey(DELAY);
/// Now, let's draw some lines
c = Drawing_Random_Lines(image, window_name, rng);
if (c != 0) return 0;
/// Go on drawing, this time nice rectangles
c = Drawing_Random_Rectangles(image, window_name, rng);
if (c != 0) return 0;
/// Draw some ellipses
c = Drawing_Random_Ellipses(image, window_name, rng);
if (c != 0) return 0;
/// Now some polylines
c = Drawing_Random_Polylines(image, window_name, rng);
if (c != 0) return 0;
/// Draw filled polygons
c = Drawing_Random_Filled_Polygons(image, window_name, rng);
if (c != 0) return 0;
/// Draw circles
c = Drawing_Random_Circles(image, window_name, rng);
if (c != 0) return 0;
/// Display text in random positions
c = Displaying_Random_Text(image, window_name, rng);
if (c != 0) return 0;
/// Displaying the big end!
c = Displaying_Big_End(image, window_name, rng);
if (c != 0) return 0;
waitKey(0);
return 0;
}
/// Function definitions
/**
* @function randomColor
* @brief Produces a random color given a random object
*/
static Scalar randomColor(RNG& rng)
{
int icolor = (unsigned)rng;
return Scalar(icolor & 255, (icolor >> 8) & 255, (icolor >> 16) & 255);
}
/**
* @function Drawing_Random_Lines
*/
int Drawing_Random_Lines(Mat image, char* window_name, RNG rng)
{
Point pt1, pt2;
for (int i = 0; i < NUMBER; i++)
{
//We know that rng is a Random number generator object.
// In the code above we are calling rng.uniform(a, b).
// This generates a randomly uniformed distribution between the values a and b(inclusive in a, exclusive in b).
//From the explanation above, we deduce that the extremes pt1 and pt2 will be random values,
// so the lines positions will be quite impredictable, giving a nice visual effect(check out the Result section below).
pt1.x = rng.uniform(x_1, x_2);
pt1.y = rng.uniform(y_1, y_2);
pt2.x = rng.uniform(x_1, x_2);
pt2.y = rng.uniform(y_1, y_2);
line(image, pt1, pt2, randomColor(rng), rng.uniform(1, 10), 8);
imshow(window_name, image);
if (waitKey(DELAY) >= 0)
{
return -1;
}
}
return 0;
}
/**
* @function Drawing_Rectangles
*/
int Drawing_Random_Rectangles(Mat image, char* window_name, RNG rng)
{
Point pt1, pt2;
int lineType = 8;
int thickness = rng.uniform(-3, 10);
for (int i = 0; i < NUMBER; i++)
{
pt1.x = rng.uniform(x_1, x_2);
pt1.y = rng.uniform(y_1, y_2);
pt2.x = rng.uniform(x_1, x_2);
pt2.y = rng.uniform(y_1, y_2);
rectangle(image, pt1, pt2, randomColor(rng), MAX(thickness, -1), lineType);
imshow(window_name, image);
if (waitKey(DELAY) >= 0)
{
return -1;
}
}
return 0;
}
/**
* @function Drawing_Random_Ellipses
*/
int Drawing_Random_Ellipses(Mat image, char* window_name, RNG rng)
{
int lineType = 8;
for (int i = 0; i < NUMBER; i++)
{
Point center;
center.x = rng.uniform(x_1, x_2);
center.y = rng.uniform(y_1, y_2);
Size axes;
axes.width = rng.uniform(0, 200);
axes.height = rng.uniform(0, 200);
double angle = rng.uniform(0, 180);
ellipse(image, center, axes, angle, angle - 100, angle + 200,
randomColor(rng), rng.uniform(-1, 9), lineType);
imshow(window_name, image);
if (waitKey(DELAY) >= 0)
{
return -1;
}
}
return 0;
}
/**
* @function Drawing_Random_Polylines
*/
int Drawing_Random_Polylines(Mat image, char* window_name, RNG rng)
{
int lineType = 8;
for (int i = 0; i< NUMBER; i++)
{
Point pt[2][3];
pt[0][0].x = rng.uniform(x_1, x_2);
pt[0][0].y = rng.uniform(y_1, y_2);
pt[0][1].x = rng.uniform(x_1, x_2);
pt[0][1].y = rng.uniform(y_1, y_2);
pt[0][2].x = rng.uniform(x_1, x_2);
pt[0][2].y = rng.uniform(y_1, y_2);
pt[1][0].x = rng.uniform(x_1, x_2);
pt[1][0].y = rng.uniform(y_1, y_2);
pt[1][1].x = rng.uniform(x_1, x_2);
pt[1][1].y = rng.uniform(y_1, y_2);
pt[1][2].x = rng.uniform(x_1, x_2);
pt[1][2].y = rng.uniform(y_1, y_2);
const Point* ppt[2] = { pt[0], pt[1] };
int npt[] = { 3, 3 };
polylines(image, ppt, npt, 2, true, randomColor(rng), rng.uniform(1, 10), lineType);
imshow(window_name, image);
if (waitKey(DELAY) >= 0)
{
return -1;
}
}
return 0;
}
/**
* @function Drawing_Random_Filled_Polygons
*/
int Drawing_Random_Filled_Polygons(Mat image, char* window_name, RNG rng)
{
int lineType = 8;
for (int i = 0; i < NUMBER; i++)
{
Point pt[2][3];
pt[0][0].x = rng.uniform(x_1, x_2);
pt[0][0].y = rng.uniform(y_1, y_2);
pt[0][1].x = rng.uniform(x_1, x_2);
pt[0][1].y = rng.uniform(y_1, y_2);
pt[0][2].x = rng.uniform(x_1, x_2);
pt[0][2].y = rng.uniform(y_1, y_2);
pt[1][0].x = rng.uniform(x_1, x_2);
pt[1][0].y = rng.uniform(y_1, y_2);
pt[1][1].x = rng.uniform(x_1, x_2);
pt[1][1].y = rng.uniform(y_1, y_2);
pt[1][2].x = rng.uniform(x_1, x_2);
pt[1][2].y = rng.uniform(y_1, y_2);
const Point* ppt[2] = { pt[0], pt[1] };
int npt[] = { 3, 3 };
fillPoly(image, ppt, npt, 2, randomColor(rng), lineType);
imshow(window_name, image);
if (waitKey(DELAY) >= 0)
{
return -1;
}
}
return 0;
}
/**
* @function Drawing_Random_Circles
*/
int Drawing_Random_Circles(Mat image, char* window_name, RNG rng)
{
int lineType = 8;
for (int i = 0; i < NUMBER; i++)
{
Point center;
center.x = rng.uniform(x_1, x_2);
center.y = rng.uniform(y_1, y_2);
circle(image, center, rng.uniform(0, 300), randomColor(rng),
rng.uniform(-1, 9), lineType);
imshow(window_name, image);
if (waitKey(DELAY) >= 0)
{
return -1;
}
}
return 0;
}
/**
* @function Displaying_Random_Text
*/
int Displaying_Random_Text(Mat image, char* window_name, RNG rng)
{
int lineType = 8;
for (int i = 1; i < NUMBER; i++)
{
Point org;
org.x = rng.uniform(x_1, x_2);
org.y = rng.uniform(y_1, y_2);
putText(image, "Testing text rendering", org, rng.uniform(0, 8),
rng.uniform(0, 100)*0.05 + 0.1, randomColor(rng), rng.uniform(1, 10), lineType);
imshow(window_name, image);
if (waitKey(DELAY) >= 0)
{
return -1;
}
}
return 0;
}
/**
* @function Displaying_Big_End
*/
int Displaying_Big_End(Mat image, char* window_name, RNG)
{
Size textsize = getTextSize("OpenCV forever!", FONT_HERSHEY_COMPLEX, 3, 5, 0);
Point org((window_width - textsize.width) / 2, (window_height - textsize.height) / 2);
int lineType = 8;
Mat image2;
for (int i = 0; i < 255; i += 2)
{
image2 = image - Scalar::all(i);
putText(image2, "OpenCV forever!", org, FONT_HERSHEY_COMPLEX, 3,
Scalar(i, i, 255), 5, lineType);
imshow(window_name, image2);
if (waitKey(DELAY) >= 0)
{
return -1;
}
}
return 0;
}