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

2.16 マウスで画像上の点を選択して HSV 値を確認

実験の目的

  1. マウスイベントに応答し、画像の HSV 値を取得できるようになります。

機能要件

画像の HSV 値を取得して出力します。

ハードウェアの準備

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

回路接続

ソフトウェア設計

設計フローチャート

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

ソースコードファイル:01_get_hsv_mouse.rar

プログラムコード

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

"""
---------------------------------------------------------------
程序功能: 鼠标点击图像中的任意一点,终端打印HSV值

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

import cv2

# ==================== 全局变量 ====================
# 用于保存当前帧(供鼠标回调函数使用)
# 因为鼠标回调函数无法直接访问主循环中的 frame 变量,
# 所以需要通过全局变量来传递当前帧数据
current_frame = None

# ==================== 鼠标回调函数 ====================
def mouse_callback(event, x, y, flags, param):
    """
    鼠标事件回调函数
    当用户在图像上点击时,获取点击位置的 RGB 和 HSV 值并打印

    参数:
        event: 鼠标事件类型(左键按下、右键按下等)
        x, y: 鼠标在窗口中的坐标(像素)
        flags: 事件标志(如Ctrl、Shift等按键状态)
        param: 用户传递的额外参数(未使用)
    """
    global current_frame  # 声明使用全局变量

    # 检测鼠标左键按下事件
    if event == cv2.EVENT_LBUTTONDOWN:
        # 如果没有当前帧数据,则返回(防止程序启动时误点击)
        if current_frame is None:
            return

        # ========== 获取 RGB 值 ==========
        # 注意:OpenCV 中图像坐标访问方式是 frame[y, x](先行后列)
        # bgr 是一个包含三个值的数组 [B, G, R]
        bgr = current_frame[y, x]  # 获取点击位置的 RGB 值

        # ========== 将 RGB 转换为 HSV ==========
        # 原因:cv2.cvtColor() 要求输入为图像格式,不能直接传入单个像素
        # 解决方案:将单个像素 reshape 为 1x1 图像(宽1,高1,通道3)
        # bgr.reshape(1, 1, 3) 将数组形状从 (3,) 变为 (1, 1, 3)
        bgr_pixel = bgr.reshape(1, 1, 3)

        # 将 RGB 颜色空间转换为 HSV 颜色空间
        hsv_pixel = cv2.cvtColor(bgr_pixel, cv2.COLOR_BGR2HSV)

        # ========== 提取 HSV 分量 ==========
        # hsv_pixel[0][0] 获取 1x1 图像中唯一像素的 HSV 值
        # 解包为三个单独变量 h, s, v
        h, s, v = hsv_pixel[0][0]

        # ========== 打印结果到终端 ==========
        # bgr.tolist() 将 numpy 数组转换为 Python 列表,便于显示
        print(f"点击位置: (x={x}, y={y}) | "
              f"RGB={bgr.tolist()} | "
              f"HSV=({h}, {s}, {v})")

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

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

# ==================== 创建窗口并绑定鼠标回调 ====================
# 创建名为 'Camera Feed' 的窗口
window_name = "Camera Feed"
cv2.namedWindow(window_name)

# 将鼠标回调函数绑定到窗口
# 当在 'Camera Feed' 窗口中进行鼠标操作时,会自动调用 mouse_callback
cv2.setMouseCallback(window_name, mouse_callback)

# ==================== 程序使用提示 ====================
print("左键点击图像查看 HSV,按 'q' 退出")

# ==================== 主循环:实时采集并显示 ====================
while True:
    # 从摄像头读取一帧图像
    ret, frame = cap.read()

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

    # 更新全局变量 current_frame
    # 使用 .copy() 创建副本,防止后续操作影响原始数据
    current_frame = frame.copy()

    # 在窗口中显示摄像头画面
    cv2.imshow(window_name, frame)

    # ==================== 键盘控制 ====================
    # 等待1毫秒,检测键盘输入
    # 如果按下 'q' 键,则退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

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

操作手順

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

実験結果

USB カメラを開き、画像上の任意の位置をマウスでクリックすると、その点の RGB 値と HSV 値がターミナルに出力されます。

参考結果:

お問い合わせ

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