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);:显示带有随机绘制线条的图像窗口,窗口标题为“绘制演示”。