一、随机数及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算法。
- 关键字前带cv的都是C里的写法,不带cv的是C++里的写法(CvRNG和RNG本质一样)
- 计算机产生的随机数都是伪随机数,是根据种子seed和特定算法计算出来的。所以,只要种子一定,算法一定,产生的随机数是相同的
- 要想产生完全重复的随机数,可以用系统时间做种子。OpenCV中用GetTickCount(),C 中用time()
2.1产生一个随机数
2.2 返回下一个随机数
- 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( σ)
上面一次只能返回一个随机数,实际上系统已经生成一个随机数组。如果我们要连续获得随机数,没有必要重新定义一个RNG类,只需要取出随机数组的下一个随机数即可。
RNG:: next返回下一个64位随机整数二、函数原型 uniform函数:
RNG:: operator返回下一个指定类型的随机数
c++原型:三、实现效果 1、线段动态生成并叠加
文章图片
RNG::uniform(a, b ):返回一个[a,b)范围的均匀分布的随机数,a,b的数据类型要一致,而且必须是int、float、double中的一种,默认是int。
文章图片
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);
}}
补充:
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
推荐阅读
- 人脸识别|【人脸识别系列】| 实现自动化妆
- OpenCV|OpenCV-Python实战(18)——深度学习简介与入门示例
- c/c++|有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代...
- C/C++|C/C++ basis 02
- opencv|图像处理之椒盐噪声的添加与去除
- 人脸识别|【人脸识别系列】| 实现人脸截图保存并编写128维特征向量
- opencv|网络爬虫入门练习
- OpenCV|【OpenCV 完整例程】89. 带阻滤波器的传递函数
- OpenCV|【OpenCV 完整例程】90. 频率域陷波滤波器
- OpenCV|【OpenCV 完整例程】22. 图像添加非中文文字