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

2.17 スライダーによる画像の HSV 範囲値の取得

実験の目的

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

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

機能要件

スライダーで HSV しきい値を動的に調整し、元画像とマスク(二値画像)をリアルタイムで表示します。

ハードウェアの準備

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

回路接続

ソフトウェア設計

設計フローチャート

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

ソースコードファイル:02_get_hsv_strip.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")
cv2.resizeWindow("HSV Control", 400, 300);  #调整窗口大小

# ==================== 创建6个滑动条 ====================
# 每个滑动条对应 HSV 的一个分量的下限或上限
# cv2.createTrackbar(trackbarName, windowName, value, count, onChange)
#   trackbarName: 滑动条名称
#   windowName: 所在窗口名称
#   value: 初始值
#   count: 最大值
#   onChange: 回调函数(lambda x: None 表示不执行任何操作)

# H(色调)滑动条:范围 0~179
cv2.createTrackbar("H Lower", "HSV Control", 0, 179, lambda x: None)
cv2.createTrackbar("H Upper", "HSV Control", 179, 179, lambda x: None)

# S(饱和度)滑动条:范围 0~255
cv2.createTrackbar("S Lower", "HSV Control", 0, 255, lambda x: None)
cv2.createTrackbar("S Upper", "HSV Control", 255, 255, lambda x: None)

# V(明度)滑动条:范围 0~255
cv2.createTrackbar("V Lower", "HSV Control", 0, 255, lambda x: None)
cv2.createTrackbar("V Upper", "HSV Control", 255, 255, lambda x: None)

# ==================== 设置滑动条初始值(绿色范围) ====================
# 绿色在 HSV 空间中的大致范围:
#   H: 35~85(绿色调)
#   S: 50~255(有一定的饱和度,排除灰色)
#   V: 50~255(有一定的亮度,排除过暗区域)
cv2.setTrackbarPos("H Lower", "HSV Control", 35)
cv2.setTrackbarPos("H Upper", "HSV Control", 85)
cv2.setTrackbarPos("S Lower", "HSV Control", 50)
cv2.setTrackbarPos("S Upper", "HSV Control", 255)
cv2.setTrackbarPos("V Lower", "HSV Control", 50)
cv2.setTrackbarPos("V Upper", "HSV Control", 255)

print("调整滑动条以设置 HSV 阈值,按 'q' 退出")

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

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

    # ========== 将 RGB 图像转换为 HSV 颜色空间 ==========
    # HSV 颜色空间更适合基于颜色的图像分割
    # Hue(色调):颜色类型
    # Saturation(饱和度):颜色纯度
    # Value(明度):颜色亮度
    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: 下限数组 [H_min, S_min, V_min]
    # upper: 上限数组 [H_max, S_max, V_max]
    lower = np.array([h_low, s_low, v_low])
    upper = np.array([h_high, s_high, v_high])

    # ========== 创建掩膜(二值图像) ==========
    # cv2.inRange(src, lowerb, upperb)
    # 对于图像中的每个像素:
    #   - 如果 lower ≤ pixel ≤ upper,则输出像素值为 255(白色)
    #   - 否则输出像素值为 0(黑色)
    mask = cv2.inRange(hsv, lower, upper)

    # ========== 应用掩膜到原图(可选) ==========
    # cv2.bitwise_and(src1, src2, mask=mask)
    # 将原图和自身进行按位与运算,只保留 mask 中白色区域的像素
    # 效果:原图中 HSV 在范围内的区域保持不变,其余区域变为黑色
    result = cv2.bitwise_and(frame, frame, mask=mask)

    # ========== 显示结果 ==========
    # 显示原始图像(RGB 格式)
    cv2.imshow("Original", frame)

    # 显示掩膜(二值图像)
    # 白色区域表示 HSV 值在设定范围内
    # 黑色区域表示 HSV 值不在设定范围内
    cv2.imshow("Mask", mask)

    # 显示处理后的彩色结果(只有符合 HSV 范围的区域有颜色)
    # 如果想查看此效果,取消下面一行的注释
    # cv2.imshow("Result", result)

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

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

操作手順

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

実験結果

USB カメラを開き、スライダーで HSV しきい値を動的に調整し、元画像とマスク(二値画像)をリアルタイムで表示します。

参考結果:

お問い合わせ

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