Qt实战|Qt+OpenCV联合开发(十七)--随机数与随机颜色

一、随机数及RNG类 1、c\c++\opencv中的随机数 我们在编程中经常用到随机数,特别在进行初始化的时候需要赋一些随机值。C和C++中产生随机数的方法如rand()、srand()等,在OpenCV中仍可以用。此外,OpenCV还特地编写了C++的随机数类RNG,C的随机数类CvRNG

  • 关键字前带cv的都是C里的写法,不带cv的是C++里的写法(CvRNG和RNG本质一样)
  • 计算机产生的随机数都是伪随机数,是根据种子seed和特定算法计算出来的。所以,只要种子一定,算法一定,产生的随机数是相同的
  • 要想产生完全重复的随机数,可以用系统时间做种子。OpenCV中用GetTickCount(),C 中用time()
2、RNG RNG类是opencv里C++的随机数产生器。它可产生一个64位的int随机数。目前可按均匀分布和高斯分布产生随机数。随机数的产生采用的是Multiply-With-Carry算法和Ziggurat算法。
2.1产生一个随机数
  • RNG可以产生3种随机数
  • RNG(int seed)//使用种子seed产生一个64位随机整数,默认-1
  • RNG::uniform( )//产生一个均匀分布的随机数
  • RNG::gaussian( )//产生一个高斯分布的随机数
  • RNG::uniform(a, b )//返回一个[a,b)范围的均匀分布的随机数,a,b的数据类型要一致,而且必须是int、float、double中的一种,默认是int。
  • RNG::gaussian( σ)//返回一个均值为0,标准差为σ的随机数。如果要产生均值为λ,标准差为σ的随机数,可以λ+ RNG::gaussian( σ)
2.2 返回下一个随机数
上面一次只能返回一个随机数,实际上系统已经生成一个随机数组。如果我们要连续获得随机数,没有必要重新定义一个RNG类,只需要取出随机数组的下一个随机数即可。
RNG:: next返回下一个64位随机整数
RNG:: operator返回下一个指定类型的随机数
二、函数原型 uniform函数:
c++原型:
Qt实战|Qt+OpenCV联合开发(十七)--随机数与随机颜色
文章图片

RNG::uniform(a, b ):返回一个[a,b)范围的均匀分布的随机数,a,b的数据类型要一致,而且必须是int、float、double中的一种,默认是int。
三、实现效果 1、线段动态生成并叠加
Qt实战|Qt+OpenCV联合开发(十七)--随机数与随机颜色
文章图片

2、线段动态生成不叠加,每次进行檫除画板
Qt实战|Qt+OpenCV联合开发(十七)--随机数与随机颜色
文章图片

3、加上动态矩形和圆形
Qt实战|Qt+OpenCV联合开发(十七)--随机数与随机颜色
文章图片

Qt实战|Qt+OpenCV联合开发(十七)--随机数与随机颜色
文章图片


四、代码
//随机数与随机颜色 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); }}

补充:
int c = waitKey(10); //延迟10毫秒
pline=Scalar(0,0,0); //每一次檫除画版,画出来的线条不会进行叠加,每次只画一条线,因为人的视觉暂留时间一般为100-400毫秒之间,而上面延迟只有10毫秒,所以你可能看到的是很多线段在闪烁
视觉暂留:眼睛的一个重要特性是视觉惰性,即光象一旦在视网膜上形成,视觉将会对这个光象的感觉维持一个有限的时间,这种生理现象叫做视觉暂留性。对于中等亮度的光刺激,视觉暂留时间约为0.1至0.4秒。
原创不易,转载请注明出处:
【Qt实战|Qt+OpenCV联合开发(十七)--随机数与随机颜色】https://blog.csdn.net/hml111666/article/details/122769585

    推荐阅读