2.10 ランダムな矩形枠の描画
実験の目的
-
位置・色・大きさがすべてランダムな矩形枠を描画します。
-
ループ、乱数生成、境界判定を使えるようになります。
機能要件
矩形枠をランダムに描画します。
ハードウェアの準備
| No. | 名称 | 数量 | 備考 |
|---|---|---|---|
| 1 | RDK X5 | 1 | 組み込みメインボード(32GB メモリーカード付き)。上位機(PC 側)システムとして動作します。 |
| 2 | カードリーダー | 1 | システムイメージの書き込みに使用します。 |
| 3 | USB カメラ | 1 | 画像を取得します。 |
| 4 | 電源ケーブル | 1 | 電源供給用です。 |
| 5 | LAN ケーブル | 1 | ネットワーク接続用です。 |
回路接続

ソフトウェア設計
設計フローチャート

ソースコードのダウンロード
ソースコードファイル:10_opencv_draw_multi_rectangle.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' 键退出")
# ==================== 主循环:实时采集并绘制 ====================
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):
# ----- 随机生成矩形的宽和高 -----
# 矩形宽度:20 ~ min(200, width//3) 像素
# - 至少20像素,保证可见
# - 最多不超过200像素或图像宽度的1/3(取较小值),避免矩形过大
rect_w = np.random.randint(20, min(200, width // 3))
# 矩形高度:20 ~ min(200, height//3) 像素
# - 至少20像素,保证可见
# - 最多不超过200像素或图像高度的1/3(取较小值),避免矩形过大
rect_h = np.random.randint(20, min(200, height // 3))
# ----- 随机生成矩形左上角坐标,确保矩形不超出图像边界 -----
# x1 范围:0 ~ (width - rect_w)
# 确保矩形右边界 x2 = x1 + rect_w ≤ width
x1 = np.random.randint(0, width - rect_w)
# y1 范围:0 ~ (height - rect_h)
# 确保矩形下边界 y2 = y1 + rect_h ≤ height
y1 = np.random.randint(0, height - rect_h)
# 计算矩形右下角坐标
x2 = x1 + rect_w # 右下角 x 坐标
y2 = y1 + rect_h # 右下角 y 坐标
# ----- 生成随机颜色 (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 设为 -1
thickness = np.random.randint(1, 10)
# ----- 绘制矩形 -----
# cv2.rectangle() 参数说明:
# frame: 要绘制的图像
# (x1, y1): 矩形左上角坐标
# (x2, y2): 矩形右下角坐标
# color: 线条颜色 (BGR格式)
# thickness: 边框线宽(像素),正数为空心,-1为实心
cv2.rectangle(frame, (x1, y1), (x2, y2), 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()
操作手順
- ターミナルを開き、Python プログラムのディレクトリに移動してプログラムを実行します。以下のコマンドを入力してください。
python 10_opencv_draw_multi_rectangle.py
実験結果
USB カメラを開き、リアルタイム映像に大きさ・位置・色・線幅がランダムな矩形を 10 個描画します。
参考結果:
お問い合わせ
資料のダウンロード・技術サポートについては、HumansX株式会社までお問い合わせください。
ドキュメント