Random number generator (Drawing colorful random lines)

class RNG - Random number generator.


RNG::next - Returns the next random number.
RNG::operator T - Returns the next random number of the specified type.
RNG::operator uchar()
RNG::operator ushort()
RNG::operator int()
RNG::operator unsigned int()
RNG::operator float()
RNG::operator double()
RNG::uniform - Returns the next random number sampled from the uniform distribution.
float RNG::uniform(float a, float b)
double RNG::uniform(double a, double b)
RNG::gaussian - Returns the next random number sampled from the Gaussian distribution.
double RNG::gaussian(double sigma)

RNG::fill - Fills arrays with random numbers.
void RNG::fill(InputOutputArray mat, int distType, InputArray a, InputArray b, bool saturateRange=false )


Example:
------------
RNG rng;

// always produces 0
double a = rng.uniform(0, 1);

// produces double from [0, 1)
double a1 = rng.uniform((double)0, (double)1);

// produces float from [0, 1)
double b = rng.uniform(0.f, 1.f);

// produces double from [0, 1)
double c = rng.uniform(0., 1.);

// may cause compiler error because of ambiguity:
//  RNG::uniform(0, (int)0.999999)? or RNG::uniform((double)0, 0.99999)?
double d = rng.uniform(0, 0.999999);
------------

The code provided below is slight modification of code given in OpenCV documentation.

Example 1: ( Drawing Colorful Random Lines )

-------------
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace cv;
using namespace std;

void Drawing_Random_Lines( Mat image, char* window_name, RNG rng, int NumOfLines, int windowHeight, int windowWidth );
static Scalar randomColor( RNG& rng );

int main( )
{    
    int windowHeight = 480, windowWidth=640;
    Mat image = Mat::zeros( windowHeight, windowWidth, CV_8UC3 );
    namedWindow( "Source", CV_WINDOW_AUTOSIZE );
    int n=1;
    while(1)
    {
    RNG rng(n);
    Drawing_Random_Lines(image, "Source", rng, 5, windowHeight, windowWidth);    
    imshow( "Source", image );
    waitKey(100);
    n++;
    }

    return(0);
}

void Drawing_Random_Lines( Mat image, char* window_name, RNG rng, int NumOfLines, int windowHeight, int windowWidth )
{
    int lineType = 8;
    Point pt1, pt2;

    for( int i = 0; i < NumOfLines; i++ )
    {
        pt1.x = rng.uniform( 0, windowWidth );
        pt1.y = rng.uniform( 0, windowHeight );
        pt2.x = rng.uniform( 0, windowWidth );
        pt2.y = rng.uniform( 0, windowHeight );

        line( image, pt1, pt2, randomColor(rng), rng.uniform(1, 10), 8 );
        imshow( window_name, image );
    }
}

static Scalar randomColor( RNG& rng )
{
    int icolor = (unsigned) rng;
    return Scalar( icolor&255, (icolor>>8)&255, (icolor>>16)&255 );
}
-------------

Example 2: ( Drawing Colorful Random Lines )

-------------
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace cv;
using namespace std;

void Drawing_Random_Lines( Mat image, char* window_name, RNG rng, int NumOfLines, int windowHeight, int windowWidth );
static Scalar randomColor( RNG& rng );

int main( )
{   
    int windowHeight = 480, windowWidth=640;
    Mat image = Mat::zeros( windowHeight, windowWidth, CV_8UC3 );
    namedWindow( "Source", CV_WINDOW_AUTOSIZE );
    int n=1;
    while(1)
    {
    RNG rng(n);
    Drawing_Random_Lines(image, "Source", rng, n, windowHeight, windowWidth);   
    imshow( "Source", image );
    waitKey(100);
    n++;
    }

    return(0);
}

void Drawing_Random_Lines( Mat image, char* window_name, RNG rng, int NumOfLines, int windowHeight, int windowWidth )
{
    int lineType = 8;
    Point pt1, pt2;

    for( int i = 0; i < NumOfLines; i++ )
    {
        pt1.x = rng.uniform( 0, windowWidth );
        pt1.y = rng.uniform( 0, windowHeight );
        pt2.x = rng.uniform( 0, windowWidth );
        pt2.y = rng.uniform( 0, windowHeight );

        line( image, pt1, pt2, randomColor(rng), rng.uniform(1, 10), 8 );
        imshow( window_name, image );
    }
}

static Scalar randomColor( RNG& rng )
{
    int icolor = (unsigned) rng;
    return Scalar( icolor&255, (icolor>>8)&255, (icolor>>16)&255 );
}

-------------

Result:


4 comments:

  1. That may be a noob question, but why didn't we use:

    Drawing_Random_Lines( Mat& image, .....
    instead of
    Drawing_Random_Lines( Mat image, .....

    for the declaration of Drawing_Random_Lines function? Isn't it more efficient?

    ReplyDelete
  2. Trung tâm đào tạo kế toán tổng hợp Tại cầu giấy
    Trung tâm đào tạo kế toán tổng hợp Tại từ liêm
    Trung tâm đào tạo kế toán tổng hợp Tại thanh xuân
    Trung tâm đào tạo kế toán tổng hợp Tại hà đông
    Trung tâm đào tạo kế toán tổng hợp Tại long biên
    Trung tâm đào tạo kế toán tổng hợp Tại nguyễn chính thanh đống đa
    Trung tâm đào tạo kế toán tổng hợp Tại minh khai hai bà trưng
    Trung tâm đào tạo kế toán tổng hợp Tại bắc ninh
    Trung tâm đào tạo kế toán tổng hợp Tại hải phòng
    Trung tâm đào tạo kế toán tổng hợp Tại tphcm
    Trung tâm đào tạo kế toán tổng hợp Tại quận 3
    Trung tâm đào tạo kế toán tổng hợp Tại thủ đức
    Trung tâm đào tạo kế toán tổng hợp Tại đà nẵng
    Trung tâm đào tạo kế toán tổng hợp Tại biên hòa
    Trung tâm đào tạo kế toán tổng hợp Tại đồng nai
    Trung tâm đào tạo kế toán tổng hợp Tại nam định
    Trung tâm đào tạo kế toán tổng hợp Tại thái bình
    Trung tâm đào tạo kế toán tổng hợp Tại bắc giang
    Trung tâm đào tạo kế toán tổng hợp Tại vĩnh phúc
    Trung tâm đào tạo kế toán tổng hợp Tại thái nguyên
    Trung tâm đào tạo kế toán tổng hợp Tại quảng ninh
    Trung tâm đào tạo kế toán tổng hợp Tại hải dương
    Trung tâm đào tạo kế toán tổng hợp Tại hưng yên
    Trung tâm đào tạo kế toán tổng hợp Tại hà nam
    Trung tâm đào tạo kế toán tổng hợp Tại ninh bình
    Trung tâm đào tạo kế toán tổng hợp Tại nghệ an
    Trung tâm đào tạo kế toán tổng hợp Tại vũng tàu

    ReplyDelete