如何在OpenCV中为InRange阈值选择颜色的最佳HSV值
Posted 程序媛一枚~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在OpenCV中为InRange阈值选择颜色的最佳HSV值相关的知识,希望对你有一定的参考价值。
之前的博客介绍了如何使用Python,OpenCV通过HSV颜色空间转换检测对象,并进行轨迹追踪。怎么选定合适的HSV颜色阈值范围非常非常非常的重要。
这篇博客将介绍如何在OpenCV中为InRange阈值选择颜色的最佳HSV值范围。
1. 效果图
原始图如下:
选出红色的范围:
(0,40,45)~(30,255,255)
选出黑色的范围:
(0,0,0)~(179,255,254)
2. 源码
# 确定hsv颜色的最佳阈值
import cv2
import numpy as np
def nothing(x):
pass
# 创建一个窗口图片
cv2.namedWindow('image')
# 对颜色变化创建轨迹兰
cv2.createTrackbar('HMin', 'image', 0, 179, nothing) # Hue is from 0-179 for Opencv
cv2.createTrackbar('SMin', 'image', 0, 255, nothing)
cv2.createTrackbar('VMin', 'image', 0, 255, nothing)
cv2.createTrackbar('HMax', 'image', 0, 179, nothing)
cv2.createTrackbar('SMax', 'image', 0, 255, nothing)
cv2.createTrackbar('VMax', 'image', 0, 255, nothing)
# 设置默认HSV空间的最大值
cv2.setTrackbarPos('HMax', 'image', 179)
cv2.setTrackbarPos('SMax', 'image', 255)
cv2.setTrackbarPos('VMax', 'image', 255)
# 初始化HSV空间最大、最小值
hMin = sMin = vMin = hMax = sMax = vMax = 0
phMin = psMin = pvMin = phMax = psMax = pvMax = 0
img = cv2.imread('images/circle.png')
output = img
waitTime = 33
while (1):
# 获取轨迹栏的当前位置
hMin = cv2.getTrackbarPos('HMin', 'image')
sMin = cv2.getTrackbarPos('SMin', 'image')
vMin = cv2.getTrackbarPos('VMin', 'image')
hMax = cv2.getTrackbarPos('HMax', 'image')
sMax = cv2.getTrackbarPos('SMax', 'image')
vMax = cv2.getTrackbarPos('VMax', 'image')
# 设置显示的HSV最大最小值
lower = np.array([hMin, sMin, vMin])
upper = np.array([hMax, sMax, vMax])
# 创建HSV图像,并根据最低、最高阈值进行阈值化
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, lower, upper)
output = cv2.bitwise_and(img, img, mask=mask)
# 展示是否HSV值有变化
if ((phMin != hMin) | (psMin != sMin) | (pvMin != vMin) | (phMax != hMax) | (psMax != sMax) | (pvMax != vMax)):
print("(hMin = %d , sMin = %d, vMin = %d), (hMax = %d , sMax = %d, vMax = %d)" % (
hMin, sMin, vMin, hMax, sMax, vMax))
phMin = hMin
psMin = sMin
pvMin = vMin
phMax = hMax
psMax = sMax
pvMax = vMax
# 展示输出图像
cv2.imshow('image', output)
# 等待33毫秒或者按下q键退出循环
if cv2.waitKey(waitTime) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
参考
以上是关于如何在OpenCV中为InRange阈值选择颜色的最佳HSV值的主要内容,如果未能解决你的问题,请参考以下文章
使用`cv::inRange` (OpenCV) 为颜色检测选择正确的 HSV 上下边界
Java opencv inRange 阈值函数使我的图像变成三个不同的图像?