2.19 HSV 色検出と画像の輪郭検出
実験の目的
-
画像の HSV の範囲値を取得します。
-
モルフォロジー処理によるノイズ除去と輪郭検出の方法を習得します。
機能要件
スライダーで HSV しきい値を動的に調整して色分割を行い、検出した物体を元画像上に赤い輪郭で表示します。
ハードウェアの準備
| No. | 名称 | 数量 | 備考 |
|---|---|---|---|
| 1 | RDK X5 | 1 | 組み込みメインボード(32GB メモリーカード付き)。上位機(PC 側)システムとして動作します。 |
| 2 | カードリーダー | 1 | システムイメージの書き込みに使用します。 |
| 3 | USB カメラ | 1 | 画像を取得します。 |
| 4 | 電源ケーブル | 1 | 電源供給用です。 |
| 5 | LAN ケーブル | 1 | ネットワーク接続用です。 |
回路接続

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

ソースコードのダウンロード
ソースコードファイル:04_get_hsv_strip_findcounters.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("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)
cv2.setTrackbarPos("H Upper", "HSV Control", 85)
# ==================== 主循环:实时采集并处理 ====================
while True:
# 从摄像头读取一帧图像
ret, frame = cap.read()
# 检查是否成功读取到图像
if not ret:
break
# ========== 1. 颜色空间转换 ==========
# 将 BGR 图像转换为 HSV 颜色空间(更适合基于颜色的分割)
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# ========== 2. 读取滑动条值 ==========
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")
# ========== 3. 创建掩膜 ==========
lower = np.array([h_low, s_low, v_low]) # HSV 下限
upper = np.array([h_high, s_high, v_high]) # HSV 上限
mask = cv2.inRange(hsv, lower, upper) # 二值掩膜(白色=在范围内)
# ========== 4. 形态学处理(去噪,使轮廓更干净) ==========
# 创建 5x5 的核(结构元素),用于形态学操作
kernel = np.ones((5, 5), np.uint8)
# 闭运算(先膨胀后腐蚀):填充小孔,连接邻近区域
# MORPH_CLOSE = 消除黑色区域中的小白点(填补空洞)
mask_clean = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
# 开运算(先腐蚀后膨胀):去除小噪点,平滑边缘
# MORPH_OPEN = 消除白色区域中的小黑点(去除噪点)
mask_clean = cv2.morphologyEx(mask_clean, cv2.MORPH_OPEN, kernel)
# ========== 5. 轮廓检测 ==========
# cv2.findContours() 查找图像中的轮廓
# 参数说明:
# mask_clean: 输入的二值图像(白色为前景,黑色为背景)
# cv2.RETR_EXTERNAL: 只检测最外层轮廓(忽略内部孔洞)
# cv2.CHAIN_APPROX_SIMPLE: 压缩水平/垂直/对角线方向,只保存端点
# 返回值:
# contours: 轮廓列表,每个轮廓是一组点坐标
# hierarchy: 轮廓层级关系(使用 RETR_EXTERNAL 时可忽略)
contours, hierarchy = cv2.findContours(mask_clean, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# ========== 6. 在原图上绘制轮廓 ==========
# 复制原图,避免在原图上直接绘制(保留原始画面)
frame_with_contours = frame.copy()
# cv2.drawContours() 绘制轮廓
# 参数说明:
# frame_with_contours: 目标图像
# contours: 轮廓列表
# -1: 绘制所有轮廓(若为索引值,则只绘制指定索引的轮廓)
# (0, 0, 255): 颜色(红色)
# 2: 线宽(像素)
cv2.drawContours(frame_with_contours, contours, -1, (0, 0, 255), 2)
# ========== 7. 横屏拼接显示 ==========
# 将掩膜(单通道)转换为 BGR 三通道,以便拼接
mask_bgr = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)
# 水平拼接:绘制了轮廓的原图(左)和掩膜(右)
combined = np.hstack((frame_with_contours, mask_bgr))
# ========== 8. 显示 HSV 参数 ==========
text = f"H:{h_low}-{h_high} S:{s_low}-{s_high} V:{v_low}-{v_high}"
cv2.putText(combined, text, (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
# ========== 9. 显示结果 ==========
cv2.imshow("Original | Mask", combined)
# ========== 10. 键盘控制 ==========
# 按 'q' 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# ==================== 资源释放 ====================
cap.release() # 释放摄像头设备
cv2.destroyAllWindows() # 关闭所有OpenCV创建的窗口
操作手順
- ターミナルを開き、Python プログラムのディレクトリに移動してプログラムを実行します。以下のコマンドを入力してください。
python 04_get_hsv_strip_findcounters.py
実験結果
スライダーで HSV しきい値を動的に調整して色分割を行い、検出した物体を元画像上に赤い輪郭で表示します。
参考結果:
お問い合わせ
資料のダウンロード・技術サポートについては、HumansX株式会社までお問い合わせください。
ドキュメント