回答问题

我有一张我想找到的带有橙色盖子位置的咖啡罐的图像。就这个 图像

gcolor2 实用程序显示盖子中心的 HSV 为 (22, 59, 100)。问题是如何选择颜色的界限呢?我尝试了 min u003d (18, 40, 90) 和 max u003d (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()

Answers

问题 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)

现在运行它。我得到如下输出:

在此处输入图像描述

希望那是你想要的。有一些错误检测,但它们很小,因此您可以选择最大的轮廓,即您的盖子。

编辑:

正如 Karl Philip 在他的评论中所说,添加新代码会很好。但是只有一行的变化。因此,我想在新的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)

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

Logo

Python社区为您提供最前沿的新闻资讯和知识内容

更多推荐