如何在OpenCV中为InRange阈值选择颜色的最佳HSV值

Posted 程序媛一枚~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在OpenCV中为InRange阈值选择颜色的最佳HSV值相关的知识,希望对你有一定的参考价值。

如何在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()

参考

参考:https://www.cnpython.com/qa/498520

以上是关于如何在OpenCV中为InRange阈值选择颜色的最佳HSV值的主要内容,如果未能解决你的问题,请参考以下文章

使用`cv::inRange` (OpenCV) 为颜色检测选择正确的 HSV 上下边界

opencv函数之cv.InRange函数

Java opencv inRange 阈值函数使我的图像变成三个不同的图像?

OpenCV:为颜色过滤选择 HSV 阈值

在 OpenCV (Java) 中获取正确的 HSV 颜色 inRange

OpenCV:使用radius有替代cv2.inRange吗?