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

2.18 HSV 処理後の画像の結合表示(横並び表示)

実験の目的

  1. 画像の HSV の範囲値を取得します。

  2. 動的なパラメータ調整を習得します。

  3. 2 つの画像の結合について理解します。

機能要件

スライダーで HSV しきい値を動的に調整し、元画像とマスクを横に連結して表示します。画像上に HSV 値を表示します。

ハードウェアの準備

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

回路接続

ソフトウェア設計

設計フローチャート

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

ソースコードファイル:03_get_hsv_strip_splice.rar

プログラムコード

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

"""
---------------------------------------------------------------
程序功能: 使用托条工具,显示hsv处理之后的图片(横屏显示)

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

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()

# ==================== 创建HSV控制窗口 ====================
# 创建名为 "HSV Control" 的窗口,用于放置滑动条
cv2.namedWindow("HSV Control")

# ==================== 创建6个滑动条 ====================
# 每个滑动条对应 HSV 的一个分量的下限或上限
# cv2.createTrackbar(trackbarName, windowName, value, count, onChange)
cv2.createTrackbar("H Lower", "HSV Control", 0, 179, lambda x: None)   # 色调下限
cv2.createTrackbar("H Upper", "HSV Control", 179, 179, lambda x: None)  # 色调上限
cv2.createTrackbar("S Lower", "HSV Control", 0, 255, lambda x: None)   # 饱和度下限
cv2.createTrackbar("S Upper", "HSV Control", 255, 255, lambda x: None)  # 饱和度上限
cv2.createTrackbar("V Lower", "HSV Control", 0, 255, lambda x: None)   # 明度下限
cv2.createTrackbar("V Upper", "HSV Control", 255, 255, lambda x: None)  # 明度上限

# ==================== 设置滑动条初始值(绿色范围) ====================
# 设置 H 分量的初始范围为 35~85(绿色的色调范围)
cv2.setTrackbarPos("H Lower", "HSV Control", 35)   # 下限设为 35
cv2.setTrackbarPos("H Upper", "HSV Control", 85)   # 上限设为 85
# 注意:S 和 V 的初始范围保持 0~255(全部保留)

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

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

    # ========== 将 BGR 图像转换为 HSV 颜色空间 ==========
    # HSV 颜色空间更适合基于颜色的图像分割
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    # ========== 读取滑动条的当前值 ==========
    h_low = cv2.getTrackbarPos("H Lower", "HSV Control")   # 色调下限
    h_high = cv2.getTrackbarPos("H Upper", "HSV Control")  # 色调上限
    s_low = cv2.getTrackbarPos("S Lower", "HSV Control")   # 饱和度下限
    s_high = cv2.getTrackbarPos("S Upper", "HSV Control")  # 饱和度上限
    v_low = cv2.getTrackbarPos("V Lower", "HSV Control")   # 明度下限
    v_high = cv2.getTrackbarPos("V Upper", "HSV Control")  # 明度上限

    # ========== 构建 HSV 阈值范围数组 ==========
    lower = np.array([h_low, s_low, v_low])  # HSV 下限
    upper = np.array([h_high, s_high, v_high])  # HSV 上限

    # ========== 创建掩膜(二值图像) ==========
    # cv2.inRange() 检查每个像素是否在 [lower, upper] 范围内
    #   - 在范围内:输出 255(白色)
    #   - 不在范围内:输出 0(黑色)
    mask = cv2.inRange(hsv, lower, upper)

    # ========== 横屏拼接:原图 + 掩膜 ==========
    # 先将掩膜(单通道灰度图)转换为 BGR 三通道图像
    # 这样才能与原图(BGR 三通道)进行拼接
    mask_bgr = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)

    # 水平拼接:原始图像(左)和掩膜图像(右)
    # np.hstack() 将两个图像左右并排组合
    combined = np.hstack((frame, mask_bgr))

    # ========== 在拼接图像上叠加 HSV 范围文本 ==========
    # 显示当前的 HSV 阈值范围,方便调试记录
    text = f"H:{h_low}-{h_high} S:{s_low}-{s_high} V:{v_low}-{v_high}"

    # cv2.putText(img, text, org, fontFace, fontScale, color, thickness)
    #   img: 目标图像
    #   text: 要显示的文本
    #   org: 文本起始坐标 (x, y)
    #   fontFace: 字体类型
    #   fontScale: 字体大小
    #   color: 颜色 (BGR格式),(0,255,0)=绿色
    #   thickness: 线宽
    cv2.putText(combined, text, (10, 30), 
                cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)

    # ========== 显示拼接后的横屏图像 ==========
    cv2.imshow("Original | Mask", combined)

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

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

操作手順

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

実験結果

USB カメラを開き、スライダーで HSV しきい値を動的に調整して、元画像とマスクを横に連結して表示し、画像上に HSV パラメータを重ねて表示します。

参考結果:

お問い合わせ

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