HumansXドキュメントセンター 公式サイトへ ↗

2.8 ランダムな水平線と垂直線の描画

実験の目的

  1. 位置や色の異なるランダムな線を描画します。

機能要件

ランダムな線を描画します。

ハードウェアの準備

No. 名称 数量 備考
1 RDK X5 1 組み込みメインボード(32GB メモリーカード付き)。上位機(PC 側)システムとして動作します。
2 カードリーダー 1 システムイメージの書き込みに使用します。
3 USB カメラ 1 画像を取得します。
4 電源ケーブル 1 電源供給用です。
5 LAN ケーブル 1 ネットワーク接続用です。

回路接続

ソフトウェア設計

設計フローチャート

ソースコードのダウンロード

ソースコードファイル:08_opencv_draw_multi_line.rar

プログラムコード

完全なプロジェクトコードは(ソースコードファイル)をクリックしてダウンロードしてください。

"""
---------------------------------------------------------------
程序功能: 使用opencv打开USB摄像头,在实时显示的图像中画10条不同颜色, 不同粗细的线

---------------------------------------------------------------
"""

import cv2
import numpy as np

# ==================== 初始化摄像头 ====================
# 打开默认摄像头 (使用udev规则)
# "/dev/mycamera" 是通过udev规则创建的符号链接,指向固定的物理摄像头
cap = cv2.VideoCapture("/dev/mycamera")

# 检查摄像头是否成功打开
if not cap.isOpened():
    print("错误:无法打开摄像头")
    exit()

print("按 'q' 键退出")

# ==================== 主循环:实时采集并绘制 ====================
while True:
    # 从摄像头读取一帧图像
    # ret: 布尔值,True表示读取成功
    # frame: 读取到的图像数据(numpy数组,BGR格式)
    ret, frame = cap.read()

    # 检查是否成功读取到图像
    if not ret:
        print("错误:无法获取帧")
        break

    # 获取图像的尺寸
    # height: 图像高度(行数)
    # width: 图像宽度(列数)
    height, width = frame.shape[:2]

    # ==================== 绘制10条随机直线 ====================
    # 循环10次,每次绘制一条随机位置、随机颜色、随机粗细的直线
    for i in range(10):
        # ----- 随机生成起点和终点坐标 -----
        # np.random.randint(0, width)  返回 [0, width) 范围内的随机整数
        # np.random.randint(0, height) 返回 [0, height) 范围内的随机整数
        x1 = np.random.randint(0, width)   # 起点 x 坐标
        y1 = np.random.randint(0, height)  # 起点 y 坐标
        x2 = np.random.randint(0, width)   # 终点 x 坐标
        y2 = np.random.randint(0, height)  # 终点 y 坐标

        # 起点和终点的坐标元组
        pt1 = (x1, y1)  # 起点
        pt2 = (x2, y2)  # 终点

        # ----- 生成随机颜色 (B, G, R) -----
        # np.random.randint(0, 256) 返回 [0, 256) 范围内的随机整数
        # 每次循环都会生成全新的随机颜色
        color = (
            np.random.randint(0, 256),  # 蓝色分量 (Blue)
            np.random.randint(0, 256),  # 绿色分量 (Green)
            np.random.randint(0, 256)   # 红色分量 (Red)
        )

        # ----- 随机生成线宽 -----
        # np.random.randint(1, 10) 返回 [1, 10) 范围内的随机整数,即 1~9
        thickness = np.random.randint(1, 10)

        # ----- 绘制直线 -----
        # cv2.line() 参数说明:
        #   frame: 要绘制的图像
        #   pt1:   起点坐标 (x1, y1)
        #   pt2:   终点坐标 (x2, y2)
        #   color: 线条颜色 (BGR格式)
        #   thickness: 线宽(像素)
        cv2.line(frame, pt1, pt2, color, thickness)

    # ==================== 显示结果 ====================
    # 在窗口中显示绘制后的图像
    cv2.imshow('Camera Feed', frame)

    # ==================== 键盘控制 ====================
    # 等待1毫秒,检测键盘输入
    # waitKey(1) 返回按键的ASCII码
    # & 0xFF 取低8位,确保兼容性
    # 如果按下 'q' 键,则退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# ==================== 资源释放 ====================
# 释放摄像头设备
cap.release()
# 关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()

操作手順

  1. ターミナルを開き、Python プログラムのディレクトリに移動してプログラムを実行します。以下のコマンドを入力してください。
python 08_opencv_draw_multi_line.py

実験結果

USB カメラを開き、リアルタイム映像に位置・色・太さがランダムな直線を 10 本描画します。

参考結果:

お問い合わせ

資料のダウンロード・技術サポートについては、HumansX株式会社までお問い合わせください。