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

2.24 LAB 色域値をプログラムに書き込む

実験の目的

  1. LAB 色域値のパラメータをプログラムに書き込む方法を習得します。

  2. 画像に対して LAB 色検出を行い、輪郭と中心点を描画します。

機能要件

LAB しきい値で色分割を行い、そのままモルフォロジー処理によるノイズ除去、輪郭検出、面積フィルタリング、中心点の計算と描画を行って、単独で動作する物体検出・位置特定を実現します。

ハードウェアの準備

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

回路接続

ソフトウェア設計

設計フローチャート

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

ソースコードファイル:09_wirte_lab.rar

プログラムコード

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

"""
---------------------------------------------------------------
程序功能: 将获取到的LAB色域值,写入程序中

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

import cv2
import numpy as np

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

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

# ==================== 定义颜色常量 ====================
ORANGE = (0, 165, 255)  # 橙色(BGR格式),用于绘制中心点
RED = (0, 0, 255)       # 红色(BGR格式),用于绘制轮廓

# ==================== 硬编码的 Lab 阈值范围 ====================
# 注意:这些值是通过之前实验(实验7-8)调试得到的最佳参数
# 目标颜色:浅绿色/黄绿色区域
# 
# 这些值是通过实验7(鼠标点击查看Lab值)获取参考值,
# 然后通过实验8(滑动条动态调试)确定的最佳范围
lower = np.array([125, 82, 70], dtype=np.uint8)   # Lab 下限:L=125, a=82, b=70
upper = np.array([255, 120, 123], dtype=np.uint8) # Lab 上限:L=255, a=120, b=123

# 参数说明:
#   L(亮度):125~255(只检测较亮的区域,排除过暗的阴影)
#   a(绿-红轴):82~120(偏红方向,绿色/黄绿色的a值通常在100附近)
#   b(蓝-黄轴):70~123(偏黄方向,黄绿色的b值通常在90附近)

#蓝色lab阈值范围
lower = np.array([28,0,85], dtype=np.uint8)   # Lab 下限
upper = np.array([125,255,241], dtype=np.uint8) # Lab 上限

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

    # 检查是否成功读取到图像
    if not ret:
        break

    # ========== 1. 颜色空间转换 ==========
    # 将 BGR 图像转换为 Lab 颜色空间
    # Lab 颜色空间更接近人眼感知,颜色距离计算更均匀
    lab = cv2.cvtColor(frame, cv2.COLOR_BGR2LAB)

    # ========== 2. 应用硬编码的 Lab 阈值 ==========
    # 使用预定义的 lower 和 upper 创建掩膜
    # 不再需要滑动条调试,直接使用固化参数
    mask = cv2.inRange(lab, lower, upper)

    # ========== 3. 形态学去噪(使轮廓更干净) ==========
    kernel = np.ones((5, 5), np.uint8)       # 创建 5x5 的核
    # 闭运算(先膨胀后腐蚀):填补小孔,连接邻近区域
    mask_clean = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
    # 开运算(先腐蚀后膨胀):去除小噪点,平滑边缘
    mask_clean = cv2.morphologyEx(mask_clean, cv2.MORPH_OPEN, kernel)

    # ========== 4. 轮廓检测 ==========
    # 查找二值图像中的所有轮廓
    # cv2.RETR_EXTERNAL: 只检测最外层轮廓
    # cv2.CHAIN_APPROX_SIMPLE: 压缩存储,只保存端点
    contours, hierarchy = cv2.findContours(mask_clean, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # ========== 5. 创建输出图像 ==========
    # 复制原图,用于绘制轮廓和中心点
    output_frame = frame.copy()
    valid_contours = []  # 存储满足面积条件的轮廓

    # ========== 6. 遍历轮廓,计算中心点 ==========
    for cnt in contours:
        # 计算轮廓面积(像素数)
        area = cv2.contourArea(cnt)

        # 面积过滤:只处理面积大于 1000 像素的轮廓
        # 过滤掉小噪点,只保留有效物体
        if area > 1000:
            valid_contours.append(cnt)  # 添加到有效轮廓列表

            # 计算轮廓的矩
            M = cv2.moments(cnt)

            # 避免除零错误(当 M["m00"]=0 时,轮廓面积为0)
            if M["m00"] != 0:
                # 计算轮廓中心点坐标
                cx = int(M["m10"] / M["m00"])  # 质心 x 坐标
                cy = int(M["m01"] / M["m00"])  # 质心 y 坐标

                # 绘制中心点(橙色实心圆,半径8像素)
                cv2.circle(output_frame, (cx, cy), radius=8, color=ORANGE, thickness=-1)

    # ========== 7. 绘制轮廓 ==========
    # 在原图上绘制所有有效轮廓(红色,线宽2像素)
    cv2.drawContours(output_frame, valid_contours, -1, RED, thickness=2)

    # ========== 8. 横屏拼接显示 ==========
    # 将掩膜(单通道)转换为 BGR 三通道,以便拼接
    mask_bgr = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)

    # 水平拼接:输出图像(左)和掩膜(右)
    combined = np.hstack((output_frame, mask_bgr))

    # ========== 9. 显示结果 ==========
    cv2.imshow("Original | Mask", combined)

    # ========== 10. 键盘控制 ==========
    # 按 'q' 键退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

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

操作手順

  1. ターミナルを開き、Python プログラムのディレクトリに移動してプログラムを実行します。以下のコマンドを入力してください。デフォルトでは緑の物体を認識します。
python 09_write_lab.py

青い物体を認識させたい場合は、測定した青の色域をプログラムに追加する必要があります(詳しい操作は下の動画をご参照ください)。

青の Lab 範囲:

下限:28,0,85

上限:125,255,241

今後、他の色の物体の LAB 範囲値を取得したい場合は、リンク 2.2.8 LAB 値処理による画像の輪郭・中心点の表示 をクリックしてください。

実験結果

LAB しきい値で色分割を行い、輪郭と中心点を描画します。今後、物体検出・位置特定システムに応用できます。

参考結果:

お問い合わせ

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