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

2.5 ランダムな円の描画

実験の目的

  1. 円などの幾何図形を描画します。

  2. ループ、乱数、カラーリストを応用できるようになります。

機能要件

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

ハードウェアの準備

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

回路接続

ソフトウェア設計

設計フローチャート

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

ソースコードファイル:05_opencv_draw_multi_circle.rar

プログラムコード

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

"""
---------------------------------------------------------------
程序功能: 
    使用opencv打开USB摄像头,在实时显示的图像中画不同大小, 
    不同位置的空心圆

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

import cv2
import numpy as np

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

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

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

# ==================== 预定义颜色列表 ====================
# 存储10种颜色,使用BGR格式(OpenCV默认颜色顺序)
colors = [
    (255, 0, 0),     # 蓝色
    (0, 255, 0),     # 绿色
    (0, 0, 255),     # 红色
    (255, 255, 0),   # 青色 (蓝+绿)
    (255, 0, 255),   # 洋红色/品红 (蓝+红)
    (0, 255, 255),   # 黄色 (绿+红)
    (128, 0, 128),   # 紫色
    (0, 128, 0),     # 深绿色
    (0, 0, 128),     # 深红色
    (128, 128, 0)    # 橄榄色
]

# ==================== 主循环:实时采集并绘制 ====================
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):
        # 计算圆的半径:10, 15, 20, 25, ... 55
        # i=0时半径10, i=1时半径15, ... i=9时半径55
        radius = 10 + i * 5

        # 随机生成圆心坐标 (x, y)
        # 确保圆心坐标不超出图像边界:圆心半径范围内不能超出图像边缘
        # np.random.randint(a, b): 返回 [a, b) 范围内的随机整数
        x = np.random.randint(radius, width - radius)
        y = np.random.randint(radius, height - radius)
        center = (x, y)

        # 从颜色列表中循环取色(i=0~9对应颜色索引0~9)
        color = colors[i % len(colors)]

        # 设置圆形的填充/空心样式
        # thickness = -1: 实心圆(填充)
        # thickness = 正数: 空心圆,正数代表轮廓线宽度(像素)
        # 偶数索引(i=0,2,4,6,8) → 实心圆
        # 奇数索引(i=1,3,5,7,9) → 空心圆,线宽为2像素
        thickness = -1 if i % 2 == 0 else 2

        # 在图像上绘制圆形
        # 参数: 图像, 圆心, 半径, 颜色, 线宽
        cv2.circle(frame, center=center, radius=radius, 
                   color=color, thickness=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 05_opencv_draw_multi_circle.py

実験結果

USB カメラを開き、リアルタイム映像に大きさ・位置・色の異なる円を 10 個描画します。塗りつぶし円と中空円が交互に表示されます。

参考結果:

お問い合わせ

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