python - 使用 cv::inRange (OpenCV) 选择正确的 HSV 上下边界进行颜色检测

标签 python opencv computer-vision hsv color-detection

我有一张带有橙色盖子位置的咖啡 jar 图片,我想找到它的位置。 这是image .

gcolor2 实用程序显示盖子中心的 HSV 为 (22, 59, 100)。 问题是如何选择极限颜色呢?我尝试了 min = (18, 40, 90) 和 max = (27, 255, 255),但得到了意想不到的 result

这是 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()

最佳答案

问题 1: 不同的应用程序对 HSV 使用不同的尺度。例如 gimp 使用 H = 0-360,S = 0-100 和 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)

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

enter image description here

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

编辑:

正如 Karl Philip 在他的评论中所说,添加新代码会很好。但是只有一行的变化。因此,我想在新的 cv2 模块中添加实现的相同代码,以便用户可以比较新的 cv2 模块的简单性和灵 active 。

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)

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

关于python - 使用 cv::inRange (OpenCV) 选择正确的 HSV 上下边界进行颜色检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10948589/

相关文章:

android - Android OpenCV-在轮廓上绘制矩形

python - 从表格图像中提取单个字段以使用OCR精益求精

python - PIL 和枕头。导入错误 : cannot import name '_imaging'

python - 如何在保存数据的同时在 for 循环中使用多处理池?

c++ - 卡尔曼滤波器没有给出正确的结果

tensorflow - 训练模型以实现 DLib 的面部标志,例如手部特征点及其标志

c++ - OpenCV:将图像包装到圆柱坐标

python - Numpy Genfromtxt 比 Pandas read_csv 慢

python - python中的多线程是一个神话吗?

image - 如何将 cv2.addWeighted 和 cv2.GaussianBlur 转换成 MATLAB?