在图像处理中,可以使用 OpenCV 中的 类生成随机数,并通过这些随机数来在图像上绘制随机线条。
RNG
效果:

目标:
使用 类生成随机数。
RNG
使用随机数绘制随机颜色的线条。
在 OpenCV 中创建和更新图像。
示例代码:生成随机数并绘制随机线条
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void random_drawing() {
// 创建一个 512x512 的黑色图像
Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);
int w = canvas.cols; // 图像的宽度
int h = canvas.rows; // 图像的高度
// 创建 RNG 对象,用于生成随机数。12345 是种子值,确保每次生成相同的随机数
RNG rng(12345);
while (true) {
// 等待用户输入,按 100 毫秒检查一次
int c = waitKey(100);
if (c == 27) { // 按下 Esc 键退出循环
break;
}
// 随机生成四个点,表示线条的起始和结束坐标
int x1 = rng.uniform(0, w); // x1 介于 0 和图像宽度之间
int y1 = rng.uniform(0, h); // y1 介于 0 和图像高度之间
int x2 = rng.uniform(0, w); // x2 介于 0 和图像宽度之间
int y2 = rng.uniform(0, h); // y2 介于 0 和图像高度之间
// 随机生成线条颜色(BGR格式)
int b = rng.uniform(0, 255); // B 通道的值
int g = rng.uniform(0, 255); // G 通道的值
int r = rng.uniform(0, 255); // R 通道的值
// 在图像上绘制随机颜色的线条
line(canvas, Point(x1, y1), Point(x2, y2), Scalar(b, g, r), 1, LINE_AA, 0);
// 显示当前的图像
imshow("随机绘制演示", canvas);
}
}
int main() {
// 调用绘制随机线条的函数
random_drawing();
waitKey(0); // 等待用户按键后退出
destroyAllWindows(); // 关闭所有窗口
return 0;
}
代码详解:
创建图像:
Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);
创建一个大小为 512×512 的图像,所有像素初始为零(即黑色)。
Mat::zeros()
表示图像有 3 个颜色通道(BGR),每个通道使用 8 位无符号整数表示颜色值。
CV_8UC3
获取图像的宽度和高度:
int w = canvas.cols;
int h = canvas.rows;
返回图像的列数(即宽度)。
canvas.cols
返回图像的行数(即高度)。
canvas.rows
创建随机数生成器:
RNG rng(12345);
是 OpenCV 提供的随机数生成器类,
RNG 是随机数的种子。使用相同的种子值可以生成相同的随机序列。
12345
生成随机数并绘制线条:
int x1 = rng.uniform(0, w); // 随机生成线条起点 x 坐标
int y1 = rng.uniform(0, h); // 随机生成线条起点 y 坐标
int x2 = rng.uniform(0, w); // 随机生成线条终点 x 坐标
int y2 = rng.uniform(0, h); // 随机生成线条终点 y 坐标
返回一个均匀分布的随机数,范围为 [min, max)。
rng.uniform(min, max)
是线条的起点坐标,
x1, y1 是线条的终点坐标。
x2, y2
int b = rng.uniform(0, 255); // 随机生成 B 通道值
int g = rng.uniform(0, 255); // 随机生成 G 通道值
int r = rng.uniform(0, 255); // 随机生成 R 通道值
随机生成 BGR 通道的颜色值,范围是 0 到 255。
绘制线条:
line(canvas, Point(x1, y1), Point(x2, y2), Scalar(b, g, r), 1, LINE_AA, 0);
函数用于绘制一条从
line() 到
(x1, y1) 的线条。
(x2, y2)
用于设置线条的颜色,
Scalar(b, g, r),
b,
g 是随机生成的蓝色、绿色和红色通道的值。
r
是线条的宽度,
1 表示抗锯齿线条,
LINE_AA 是连接点类型。
0
显示图像:
imshow("随机绘制演示", canvas);
使用 显示绘制后的图像。
imshow()
退出程序:
int c = waitKey(100);
if (c == 27) { // 按下 Esc 键退出
break;
}
等待 100 毫秒并检查用户是否按下键盘上的按键。如果按下
waitKey(100) 键(ASCII 27),则退出程序。
Esc
使用场景:
随机图形生成:用于生成随机图形效果,例如在测试和模拟中创建图像。
图像增强:可以用随机图形模拟噪声,帮助进行噪声去除算法的测试。
视觉效果设计:用于生成具有随机颜色和形状的艺术效果。





![[C++探索之旅] 第一部分第十一课:小练习,猜单词 - 鹿快](https://img.lukuai.com/blogimg/20251015/da217e2245754101b3d2ef80869e9de2.jpg)










暂无评论内容