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

Stu*_*urK 67 opencv hsv color-detection

我有一个咖啡罐的图像,橙色的盖子位置,我想找到.就这个图片.

gcolor2实用程序显示盖子中心的HSV为(22,59,100).问题是如何选择颜色的限制呢?我尝试了min =(18,40,90)和max =(27,255,255),但是出乎意料结果

这是Python代码:

import cv

in_image = 'kaffee.png'
out_image = 'kaffee_out.png'
out_image_thr = 'kaffee_thr.png'

ORANGE_MIN = cv.Scalar(18, 40, 90)
ORANGE_MAX = cv.Scalar(27, 255, 255)
COLOR_MIN = ORANGE_MIN
COLOR_MAX = ORANGE_MAX

def test1():
    frame = cv.LoadImage(in_image)
    frameHSV = cv.CreateImage(cv.GetSize(frame), 8, 3)
    cv.CvtColor(frame, frameHSV, cv.CV_RGB2HSV)
    frame_threshed = cv.CreateImage(cv.GetSize(frameHSV), 8, 1)
    cv.InRangeS(frameHSV, COLOR_MIN, COLOR_MAX, frame_threshed)
    cv.SaveImage(out_image_thr, frame_threshed)

if __name__ == '__main__':
    test1()
Run Code Online (Sandbox Code Playgroud)

Abi*_*n K 131

问题1:不同的应用程序对HSV使用不同的比例.例如gimp使用H = 0-360, S = 0-100 and V = 0-100.但OpenCV使用 H: 0-179, S: 0-255, V: 0-255.这里我的gimp的色调值为22.所以我拿了一半,11,并为此定义了范围.即(5,50,50) - (15,255,255).

问题2:而且,OpenCV使用BGR格式,而不是RGB.因此,更改将RGB转换为HSV的代码,如下所示:

cv.CvtColor(frame, frameHSV, cv.CV_BGR2HSV)
Run Code Online (Sandbox Code Playgroud)

现在运行它.我有一个输出如下:

在此输入图像描述

希望这就是你想要的.有一些错误的检测,但它们很小,所以你可以选择最大的轮廓,这是你的盖子.

编辑:

正如卡尔·菲利普在评论中所说,添加新代码会很好.但是只有一条线的变化.所以,我想在新cv2模块中添加相同的代码,因此用户可以比较新cv2模块的简易性和灵活性.

import cv2
import numpy as np

img = cv2.imread('sof.jpg')

ORANGE_MIN = np.array([5, 50, 50],np.uint8)
ORANGE_MAX = np.array([15, 255, 255],np.uint8)

hsv_img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

frame_threshed = cv2.inRange(hsv_img, ORANGE_MIN, ORANGE_MAX)
cv2.imwrite('output2.jpg', frame_threshed)
Run Code Online (Sandbox Code Playgroud)

它给出了与上面相同的结果.但代码要简单得多.


Kin*_*t 金 33

好的,在HSV太空中找到颜色是一个古老而常见的问题.我做了一个hsv-colormap快速查找特殊颜色.这里是:

在此输入图像描述

x轴表示Hue[0,180],y 轴1表示Saturation[0,255],y轴2表示S = 255,而保持V = 255.

要查找颜色,通常只需查找和的范围,HS在范围(20,255)中设置v.

要找到橙色,我们会查找地图,找到最佳范围:H :[10, 25], S: [100, 255], and V: [20, 255].所以面具是cv2.inRange(hsv,(10, 100, 20), (25, 255, 255) )

然后我们使用找到的范围来寻找橙色,这是结果:

在此输入图像描述


该方法很简单但常用:

#!/usr/bin/python3
# 2018.01.21 20:46:41 CST
import cv2

img = cv2.imread("test.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv,(10, 100, 20), (25, 255, 255) )
cv2.imshow("orange", mask);cv2.waitKey();cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

类似的答案:

  1. 如何定义阈值以仅检测图像中的绿色对象:Opencv

  2. 使用InRangeS为OpenCV阈值选择正确的HSV值


nat*_*ncy 32

这是一个简单的 HSV 颜色阈值器脚本,用于使用磁盘上任何图像的轨迹栏确定下/上颜色范围。只需更改图像路径cv2.imread()

在此处输入图片说明

import cv2
import numpy as np

def nothing(x):
    pass

# Load image
image = cv2.imread('1.jpg')

# Create a window
cv2.namedWindow('image')

# Create trackbars for color change
# Hue is from 0-179 for Opencv
cv2.createTrackbar('HMin', 'image', 0, 179, nothing)
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)

# Set default value for Max HSV trackbars
cv2.setTrackbarPos('HMax', 'image', 179)
cv2.setTrackbarPos('SMax', 'image', 255)
cv2.setTrackbarPos('VMax', 'image', 255)

# Initialize HSV min/max values
hMin = sMin = vMin = hMax = sMax = vMax = 0
phMin = psMin = pvMin = phMax = psMax = pvMax = 0

while(1):
    # Get current positions of all trackbars
    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')

    # Set minimum and maximum HSV values to display
    lower = np.array([hMin, sMin, vMin])
    upper = np.array([hMax, sMax, vMax])

    # Convert to HSV format and color threshold
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    mask = cv2.inRange(hsv, lower, upper)
    result = cv2.bitwise_and(image, image, mask=mask)

    # Print if there is a change in HSV value
    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

    # Display result image
    cv2.imshow('image', result)
    if cv2.waitKey(10) & 0xFF == ord('q'):
        break

cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

  • 这非常有帮助。计算出合适的 HSV 范围的速度加快了 20 倍。许多马哈洛斯! (9认同)
  • 哇!正如已经评论的那样,非常有帮助。感谢分享! (6认同)
  • 纯粹的敬畏!非常感谢 (6认同)
  • 只是想回应上面的评论并说这个颜色选择器太棒了。对于达到 90% 的准确 HSV 阈值非常有帮助,非常感谢。 (2认同)

Aru*_*ldd 25

我创建了这个简单的程序来实时获取HSV代码

import cv2
import numpy as np


cap = cv2.VideoCapture(0)

def nothing(x):
    pass
# Creating a window for later use
cv2.namedWindow('result')

# Starting with 100's to prevent error while masking
h,s,v = 100,100,100

# Creating track bar
cv2.createTrackbar('h', 'result',0,179,nothing)
cv2.createTrackbar('s', 'result',0,255,nothing)
cv2.createTrackbar('v', 'result',0,255,nothing)

while(1):

    _, frame = cap.read()

    #converting to HSV
    hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)

    # get info from track bar and appy to result
    h = cv2.getTrackbarPos('h','result')
    s = cv2.getTrackbarPos('s','result')
    v = cv2.getTrackbarPos('v','result')

    # Normal masking algorithm
    lower_blue = np.array([h,s,v])
    upper_blue = np.array([180,255,255])

    mask = cv2.inRange(hsv,lower_blue, upper_blue)

    result = cv2.bitwise_and(frame,frame,mask = mask)

    cv2.imshow('result',result)

    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break

cap.release()

cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

  • 大声笑,我写了相同的代码打印最终的HSV值使用https://github.com/saurabheights/ImageProcessingExperimentScripts/blob/master/AnalyzeHSV/hsvThresholder.py (8认同)

Har*_*rah 10

为此,我使用 opencv-python 创建了一个简单(更合适)的工具。认为这对于像我今年早些时候那样偶然发现这里的人来说会有用

在此输入图像描述

由于该工具本身是使用 python cv2 编写的,因此可以保证使用相同的范围。还有一个滑块erodedilate因为通常计算机视觉项目需要这两个功能

您可以从此处克隆该工具https://github.com/hariangr/HsvRangeTool


小智 6

OpenCV HSV 范围是: H:0 到 179 S:0 到 255 V:0 到 255

在 Gimp(或其他照片处理 sw)上,Hue 范围从 0 到 360,因为 opencv 将颜色信息放在单个字节中,单个字节中的最大数字值为 255,因此 openCV Hue 值等于来自 gimp 的 Hue 值除以 2 .

我发现在尝试基于 HSV 颜色空间进行对象检测时,5 的范围(opencv 范围)足以过滤掉特定颜色。我建议您使用 HSV 色觉来确定最适合您的应用程序的范围。

在 HSV 空间中进行颜色检测的 HSV 色觉


Mas*_*lah 6

要查找绿色的 HSV 值,请尝试在 Python 终端中执行以下命令

green = np.uint8([[[0,255,0 ]]])
hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
print hsv_green
[[[ 60 255 255]]]
Run Code Online (Sandbox Code Playgroud)