Random Number Generator(随机数发生器对象)RNG
RNG rng( 0xFFFFFFFF)
RNG实现了一个随机数发生器。 在上面的例子中, rng 是用数值 0xFFFFFFFF 来实例化的一个RNG对象。
下面通过opencv绘图功能来了解RNG
代码:
#include<opencv2/opencv.hpp>
#include <iostream>
#define window_height 500
#define window_width 500
#define NUMBER 100
using namespace cv;
int DrawRandomLines(Mat img,char *windowname,RNG rng);
int Displaying_Random_Text( Mat image, char* window_name, RNG rng );
void main()
{
Mat img=Mat::zeros(window_width,window_height,CV_8UC3);
RNG rng(0xFFFFFFFF);
DrawRandomLines(img,"lines",rng);
Displaying_Random_Text(img,"text",rng);
}
int DrawRandomLines( Mat img,char *windowname,RNG rng )
{
int linetype = 8;
Point pt1,pt2;
for (int n=0;n<NUMBER;n++)
{
pt1.x = rng.uniform(1,500);
pt1.y = rng.uniform(1,500);
pt2.x = rng.uniform(1,500);
pt2.y = rng.uniform(1,500);
line(img,pt1,pt2,Scalar(rng.uniform(1,255),rng.uniform(1,255),rng.uniform(1,255)),rng.uniform(1,10),linetype);
imshow(windowname,img);
if (waitKey(300)>0)
{
return -1;
}
}
return 0;
}
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(1,500);
org.y = rng.uniform(1,500);
putText( image, "lifang", org, rng.uniform(0,8),
rng.uniform(0,100)*0.05+0.1, Scalar(rng.uniform(1,255),rng.uniform(1,255),rng.uniform(1,255)), rng.uniform(1, 10), lineType);
imshow( window_name, image );
if( waitKey(300) >= 0 )
{ return -1; }
}
//destroyWindow(window_name);
return 0;
}
我们来分析分析函数int DrawRandomLines( Mat img,char *windowname,RNG rng )
我们可以看到:
for 循环将重复 NUMBER 次。 并且函数 line 在循环中, 这意味着要生成 NUMBER 条线段。
线段的两个端点分别是 pt1 和 pt2. 对于 pt1 我们看到:
pt1.x = rng.uniform( 1, 500);
pt1.y = rng.uniform( 1, 500);
我们知道 rng 是一个 随机数生成器 对象。在上面的代码中我们调用了 rng.uniform(a,b) 。这指定了一个在 a 和 b 之间的均匀分布(包含 a, 但不含 b)。
由上面的说明,我们可以推断出 pt1 和 pt2 将会是随机的数值,因此产生的线段是变幻不定的,这会产生一个很好的视觉效果(从下面绘制的图片可以看出)。
我们还可以发现, 在 line 的参数设置中,对于 color 的设置我们用了:
Scalar(rng.uniform(1,255),rng.uniform(1,255),rng.uniform(1,255))
所欲线段的颜色也是随机的。
运行结果: