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+OpenCV联合开发(十七)--随机数与随机颜色_第1张图片

RNG::uniform(a, b )  :返回一个[a,b)范围的均匀分布的随机数,a,b的数据类型要一致,而且必须是int、float、double中的一种,默认是int。

三、实现效果

1、线段动态生成并叠加

Qt+OpenCV联合开发(十七)--随机数与随机颜色_第2张图片

2、线段动态生成不叠加,每次进行檫除画板

Qt+OpenCV联合开发(十七)--随机数与随机颜色_第3张图片

 3、加上动态矩形和圆形

Qt+OpenCV联合开发(十七)--随机数与随机颜色_第4张图片

Qt+OpenCV联合开发(十七)--随机数与随机颜色_第5张图片

四、代码

//随机数与随机颜色
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秒。

原创不易,转载请注明出处:

https://blog.csdn.net/hml111666/article/details/122769585

你可能感兴趣的:(Qt实战,opencv,C/C++,opencv,qt,人工智能)