【OpenCV + VS】OpenCV 随机数绘图:如何在图像中绘制随机线条

        在图像处理中,可以使用 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);


Mat::zeros()
创建一个大小为 512×512 的图像,所有像素初始为零(即黑色)。


CV_8UC3
表示图像有 3 个颜色通道(BGR),每个通道使用 8 位无符号整数表示颜色值。

获取图像的宽度和高度:



int w = canvas.cols;
int h = canvas.rows;


canvas.cols
返回图像的列数(即宽度)。


canvas.rows
返回图像的行数(即高度)。

创建随机数生成器:


RNG rng(12345);


RNG
是 OpenCV 提供的随机数生成器类,
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 坐标


rng.uniform(min, max)
返回一个均匀分布的随机数,范围为 [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;
}


waitKey(100)
等待 100 毫秒并检查用户是否按下键盘上的按键。如果按下
Esc
键(ASCII 27),则退出程序。

使用场景:

随机图形生成:用于生成随机图形效果,例如在测试和模拟中创建图像。

图像增强:可以用随机图形模拟噪声,帮助进行噪声去除算法的测试。

视觉效果设计:用于生成具有随机颜色和形状的艺术效果。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容