OpenCV-Python快速入门系列15随机数与随机颜色

前言

随机数在图像处理和计算机视觉中有着广泛应用,例如生成随机颜色、随机坐标等。在这篇文章中,我们使用 OpenCV 和 NumPy 来实现一个动态绘制随机颜色线条的小程序,并详细讲解核心实现。

完整代码

import cv2 as cv
import numpy as np

def random_color_demo():
    # 创建一个黑色画布
    image = np.zeros((512, 512, 3), dtype=np.uint8)

    while True:
        # 生成随机坐标 (x1, y1) 和 (x2, y2)
        pt1 = tuple(np.random.randint(0, 512, size=2))
        pt2 = tuple(np.random.randint(0, 512, size=2))

        # 生成随机颜色 (B, G, R)
        color = tuple(np.random.randint(0, 256, size=3))

        # 绘制随机线条
        cv.line(image, pt1, pt2, color, thickness=1, lineType=cv.LINE_8)

        # 显示结果
        cv.imshow("Random Color Lines", image)

        # 等待按键,按下 ESC 键退出
        if cv.waitKey(1) == 27:
            break

    # 关闭所有窗口
    cv.destroyAllWindows()

# 调用函数
random_color_demo()

代码详解

1. 创建画布

image = np.zeros((512, 512, 3), dtype=np.uint8)
  • 使用 np.zeros() 创建一个大小为 512×512 的黑色图像。
  • 数据类型设置为 uint8,表示每个像素的取值范围是 0~255。
  • 3 表示图像有三个通道(BGR)。

2. 生成随机坐标

pt1 = tuple(np.random.randint(0, 512, size=2))
pt2 = tuple(np.random.randint(0, 512, size=2))
  • np.random.randint(0, 512, size=2) 生成两个随机整数,范围是 [0, 512),分别代表 x 和 y 坐标。
  • 使用 tuple() 将生成的数组转换为坐标点格式 (x, y)

3. 生成随机颜色

color = tuple(np.random.randint(0, 256, size=3))
  • np.random.randint(0, 256, size=3) 生成三个随机整数,范围是 [0, 256),分别代表 B(蓝)、G(绿)、R(红)三通道颜色值。
  • 通过 tuple() 转换为颜色格式 (B, G, R)

4. 绘制随机线条

cv.line(image, pt1, pt2, color, thickness=1, lineType=cv.LINE_8)
  • image: 待绘制图像。
  • pt1, pt2: 直线的起点和终点坐标 (x1, y1)(x2, y2)
  • color: 直线颜色 (B, G, R)
  • thickness: 线条宽度,这里设置为 1
  • lineType: 线条类型,cv.LINE_8 表示 8 像素连接线条,是默认值。

5. 显示图像与退出检测

cv.imshow("Random Color Lines", image)
if cv.waitKey(1) == 27:
break
  • cv.imshow(): 显示图像窗口,窗口标题为 "Random Color Lines"
  • cv.waitKey(1): 等待 1 毫秒检测按键。如果按下 ESC(ASCII 码为 27),退出循环。

6. 关闭窗口

cv.destroyAllWindows()
  • 关闭所有由 OpenCV 创建的窗口,释放资源。

优化思路

  1. 简化坐标和颜色生成
    • 使用 NumPy 的 size=2size=3 配合 tuple(),减少手动拆分数组和显式转换的代码。
  2. 参数调整灵活性
    • 可以将画布大小、线条宽度、颜色范围等设置为函数参数,便于复用。

运行效果

图片[1]-OpenCV-Python快速入门系列15随机数与随机颜色-天煜博客
© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容