一、随机数及RNG类
1、c\c++\opencv中的随机数
我们在编程中经常用到随机数,特别在进行初始化的时候需要赋一些随机值。C和C++中产生随机数的方法如rand()、srand()等,在OpenCV中仍可以用。此外,OpenCV还特地编写了C++的随机数类RNG,C的随机数类CvRNG
2、RNG
RNG类是opencv里C++的随机数产生器。它可产生一个64位的int随机数。目前可按均匀分布和高斯分布产生随机数。随机数的产生采用的是Multiply-With-Carry算法和Ziggurat算法。
2.1产生一个随机数
2.2 返回下一个随机数
上面一次只能返回一个随机数,实际上系统已经生成一个随机数组。如果我们要连续获得随机数,没有必要重新定义一个RNG类,只需要取出随机数组的下一个随机数即可。
二、函数原型
uniform函数:
三、实现效果
1、线段动态生成并叠加
2、线段动态生成不叠加,每次进行檫除画板
3、加上动态矩形和圆形
四、代码
//随机数与随机颜色
void test1::random_drawing()
{
Mat pline = Mat::zeros(Size(512,512),CV_8UC3);
int w = pline.cols;
int h = pline.rows;
RNG rng(12345);//12345是产生随机数的种子
while(true)
{
int c = waitKey(10);
if(c == 27)//esc退出
{
break;
}
int x1=rng.uniform(0,w);
int y1=rng.uniform(0,h);
int x2=rng.uniform(0,w);
int y2=rng.uniform(0,h);
int b = rng.uniform(0,255);
int g = rng.uniform(0,255);
int r = rng.uniform(0,255);
pline=Scalar(0,0,0);
line(pline,Point(x1,y1),Point(x2,y2),Scalar(b,g,r),1,LINE_AA,0);//LINE_AA反锯齿
imshow("random_drawing",pline);
}
}