2.22 画像上の点を選択して LAB 値を確認
実験の目的
- マウスイベントに応答し、画像の LAB 値を取得できるようになります。
機能要件
画像上の任意の位置をマウスでクリックすると、その点の Lab 値がターミナルに出力されます。
ハードウェアの準備
| No. | 名称 | 数量 | 備考 |
|---|---|---|---|
| 1 | RDK X5 | 1 | 組み込みメインボード(32GB メモリーカード付き)。上位機(PC 側)システムとして動作します。 |
| 2 | カードリーダー | 1 | システムイメージの書き込みに使用します。 |
| 3 | USB カメラ | 1 | 画像を取得します。 |
| 4 | 電源ケーブル | 1 | 電源供給用です。 |
| 5 | LAN ケーブル | 1 | ネットワーク接続用です。 |
回路接続

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

ソースコードのダウンロード
ソースコードファイル:07_get_lab_mouse.rar
プログラムコード
完全なプロジェクトコードは(ソースコードファイル)をクリックしてダウンロードしてください。
"""
---------------------------------------------------------------
程序功能: 鼠标点击图像中的任意一点,终端打印LAB值
---------------------------------------------------------------
"""
import cv2
# ==================== 全局变量 ====================
# 用于保存当前帧(供鼠标回调函数使用)
# 因为鼠标回调函数无法直接访问主循环中的 frame 变量,
# 所以需要通过全局变量来传递当前帧数据
current_frame = None
# ==================== 鼠标回调函数 ====================
def mouse_callback(event, x, y, flags, param):
"""
鼠标事件回调函数
当用户在图像上点击时,获取点击位置的 BGR 和 Lab 值并打印
参数:
event: 鼠标事件类型(左键按下、右键按下等)
x, y: 鼠标在窗口中的坐标(像素)
flags: 事件标志(如Ctrl、Shift等按键状态)
param: 用户传递的额外参数(未使用)
"""
global current_frame # 声明使用全局变量
# 检测鼠标左键按下事件
if event == cv2.EVENT_LBUTTONDOWN:
# 如果没有当前帧数据,则返回(防止程序启动时误点击)
if current_frame is None:
return
# ========== 获取 BGR 值 ==========
# 注意:OpenCV 中图像坐标访问方式是 frame[y, x](先行后列)
# bgr 是一个包含三个值的数组 [B, G, R]
bgr = current_frame[y, x] # 获取点击位置的 BGR 值
# ========== 将 BGR 转换为 Lab ==========
# 原因:cv2.cvtColor() 要求输入为图像格式,不能直接传入单个像素
# 解决方案:将单个像素 reshape 为 1x1 图像(宽1,高1,通道3)
# bgr.reshape(1, 1, 3) 将数组形状从 (3,) 变为 (1, 1, 3)
bgr_pixel = bgr.reshape(1, 1, 3)
# 将 BGR 颜色空间转换为 Lab 颜色空间
# COLOR_BGR2LAB: BGR → Lab 转换
# Lab 颜色空间更接近人眼感知,颜色距离计算更均匀
lab_pixel = cv2.cvtColor(bgr_pixel, cv2.COLOR_BGR2LAB)
# ========== 提取 Lab 分量 ==========
# lab_pixel[0][0] 获取 1x1 图像中唯一像素的 Lab 值
# 解包为三个单独变量 L, a, b
# 注意:变量名 b 与 BGR 中的 b 冲突,但此处是 Lab 的 b* 分量
L, a, b = lab_pixel[0][0]
# ========== 打印结果到终端 ==========
# bgr.tolist() 将 numpy 数组转换为 Python 列表,便于显示
print(f"点击位置: (x={x}, y={y}) | "
f"RGB={bgr.tolist()} | "
f"Lab=({L}, {a}, {b})")
# ==================== 初始化摄像头 ====================
# 打开默认摄像头(使用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("左键点击图像查看 Lab 值,按 '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创建的窗口
操作手順
- ターミナルを開き、Python プログラムのディレクトリに移動してプログラムを実行します。以下のコマンドを入力してください。
python 07_get_lab_mouse.py
実験結果
USB カメラを開き、画像上の任意の位置をマウスでクリックすると、その点の RGB 値と Lab 値がターミナルに出力されます。
参考結果:
お問い合わせ
資料のダウンロード・技術サポートについては、HumansX株式会社までお問い合わせください。
ドキュメント