第十五节 随机数与随机颜色



void  QUickdemo::random_drawing(Mat& image)
{
    Mat canvas = Mat::zeros(image.size(), image.type());
    int w = canvas.cols;
    int h = canvas.rows;
    RNG rng(123456);--RNG随机数生成器的种子值12345
    while (true) {
        int c = waitKey(10);
        if (c == 27) {
            break;
        }
        int x1 = rng.uniform(0, w);--uniform用于生成随机数整数,rng种子值
        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);*/

        line(canvas, Point(x1, y1), Point(x2, y2), Scalar(rng.uniform(0,255), rng.uniform(0, 255), rng.uniform(0, 255)), 4, 8, 0);在canvas上画一个起始点为x1y1,终点为x2y2的直线,颜色是随机的
        imshow("绘制演示",canvas);
    }


}


这个函数名为random_drawing,作用是在给定的图像上随机绘制线条,直到用户按下 Esc 键(键码为 27)退出。

代码详解:

• Mat canvas = Mat::zeros(image.size(), image.type());:创建一个与输入图像image大小和类型相同的全黑图像canvas,用于绘制随机线条。

• int w = canvas.cols;和int h = canvas.rows;:获取图像的宽度w和高度h。

• RNG rng(123456);:创建一个随机数生成器对象rng,并使用固定的种子值 123456 初始化,这样可以确保每次运行程序时生成的随机数序列是相同的(如果需要不同的随机数序列,可以使用不同的种子值或不指定种子值)。

• while (true)循环:这是一个无限循环,直到用户按下 Esc 键才会退出。

• int c = waitKey(10);:等待 10 毫秒,如果在此期间有按键按下,则返回按键的 ASCII 值;如果没有按键按下,则返回 -1。

• if (c == 27):如果按下的键是 Esc 键,则退出循环。

• int x1 = rng.uniform(0, w);等语句:生成两个随机点的坐标(x1, y1)和(x2, y2),范围在图像的宽度和高度范围内。

• line(canvas, Point(x1, y1), Point(x2, y2), Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)), 4, 8, 0);:在canvas图像上绘制一条从(x1, y1)到(x2, y2)的彩色线条,线条颜色是由随机生成的 RGB 值组成,线条粗细为 4,连接类型为 8 连接。

• imshow("绘制演示", canvas);:显示带有随机绘制线条的图像窗口,窗口标题为“绘制演示”。

个人理解,如有不对,请多指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值