电脑会自动识别你指定的颜色,只框出这个颜色的物体。
一、示例代码
python
import cv2
import numpy as np
# 1. 读取图片
img = cv2.imread("test.jpg")
# 2. 转 HSV 颜色空间(颜色追踪必须用HSV!)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# ----------------【核心:设置要追踪的颜色范围】----------------
# 我们先追踪 【蓝色】
lower_blue = np.array([90, 100, 100]) # 蓝色最小值
upper_blue = np.array([130, 255, 255]) # 蓝色最大值
# 3. 创建掩膜:只保留蓝色区域,其他全变黑
mask = cv2.inRange(hsv, lower_blue, upper_blue)
# 4. 找出蓝色区域的轮廓
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 5. 只给蓝色物体画框
for cnt in contours:
area = cv2.contourArea(cnt)
if area > 200: # 过滤小噪点
x, y, w, h = cv2.boundingRect(cnt)
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2) # 蓝色框
cv2.putText(img, "Blue", (x, y-5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255,0,0), 2)
# 显示结果
cv2.imshow("Mask(只看蓝色)", mask)
cv2.imshow("Result", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
二、关键代码和原理解析
1. 为什么要转 HSV?
-
平时的 BGR 颜色很难按颜色筛选
-
HSV 专门用来按颜色范围筛选,是颜色追踪的标准!
-
OpenCV 中 HSV 三个通道取值固定:
-
H(Hue 色相) :第 1 个值,颜色本身
- 范围:
0 ~ 179 - 作用:区分红、黄、绿、蓝、紫等基础颜色,是选色的核心。
- 参考区间(常用):
- 红色:0~10 170-179
- 黄色:20~30
- 绿色:40~80
- 蓝色:90~130
- 0 红 → 30 黄 → 60 绿 → 120 蓝 → 150 紫 → 179 回到红
- 0--10:红 1
- 10--25:橙
- 25--35:黄
- 35--85:绿
- 85--100:青 / 浅蓝
- 100--130:蓝
- 130--170:紫 / 品红(你问的 140--169 在这里)
- 170--179:红 2(和 0--10 合起来是完整红色)
- 范围:
-
S(Saturation 饱和度) :第 2 个值,颜色鲜艳程度
- 范围:
0 ~ 255 - 0 = 灰度(黑白灰,无彩色),255 = 颜色最浓郁。
- 实操:一般设
100~255,过滤掉发白、发灰的杂色 / 反光。
- 范围:
-
V(Value 明度 / 亮度) :第 3 个值,明暗程度
- 范围:
0 ~ 255 - 0 = 纯黑,255 = 纯白。
- 实操:一般设
100~255,过滤掉阴影、过暗区域。
- 范围:
python
lower_blue = np.array([90, 100, 100]) # 蓝色最小值
upper_blue = np.array([130, 255, 255]) # 蓝色最大值
色相:90-130 蓝色区间
饱和度:100-255 只保留色彩不发灰的像素
亮度:100-255 只保留不算太暗的像素
整体规则:像素的 H、S、V 同时落在 下限,上限 之间,会被保留为白色(目标区域),其余为黑。
python
mask = cv2.inRange(hsv, lower_blue, upper_blue)
2. 添加文字
python
cv2.putText(
img, # 画在哪个图上
"Blue", # 文字内容
(x, y-5), # 文字位置
cv2.FONT_HERSHEY_SIMPLEX, # 字体
0.6, #字体大小(缩放比例 /fontScale)0.4 → 很小,0.6 → 中等偏小,1.0 → 标准大小,1.5 → 很大,2.0 → 巨大
(255,0,0), # 颜色 BGR
2 # 线条粗细
)
三、效果图
