我有一个咖啡罐的图像,我想找到它的橙色盖子位置。就这个.
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()
原文由 Student FourK 发布,翻译遵循 CC BY-SA 4.0 许可协议
问题 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 的代码,如下所示:
现在运行它。我得到如下输出:
希望这就是你想要的。有一些错误检测,但它们很小,所以你可以选择最大的轮廓,即你的盖子。
编辑:
正如 Karl Philip 在他的评论中所说,添加新代码会很好。但是只有一行的变化。因此,我想添加在新的
cv2
模块中实现的相同代码,以便用户可以比较新的cv2
模块的简单性和灵活性。它给出了与上面相同的结果。但是代码要简单得多。