首页 > 后端开发 > Python教程 > 如何在 OpenCV 中选择正确的 HSV 上边界和下边界以进行准确的颜色检测?

如何在 OpenCV 中选择正确的 HSV 上边界和下边界以进行准确的颜色检测?

Mary-Kate Olsen
发布: 2024-12-02 01:36:10
原创
843 人浏览过

How to Choose the Correct HSV Upper and Lower Boundaries for Accurate Color Detection in OpenCV?

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

使用OpenCV 中的 cv::inRange 函数,为 HSV 选择合适的上下边界(Hue、饱和度、值)色彩空间。这可确保准确的颜色检测并实现高效的分割。

问题:

考虑一张咖啡罐上包含橙色盖子的图像。使用 gcolor2 实用程序获得的盖子中心的 HSV 值为 (22, 59, 100)。使用定义为 min = (18, 40, 90) 和 max = (27, 255, 255) 的初始边界会导致意外的检测结果。

解决方案:

问题1:HSV范围变化

不同的应用程序通常对 HSV 值使用不同的比例。例如,GIMP采用H:0-360,S:0-100,V:0-100的范围,而OpenCV使用H:0-179,S:0-255,V:0-255。在这种情况下,GIMP 中的色调值为 22,应将其值的一半转换为 OpenCV 中的 11。因此,修改后的边界变为 (5, 50, 50) - (15, 255, 255)。

问题 2:颜色空间兼容性

OpenCV 采用 BGR (蓝-绿-红)颜色格式,而不是 RGB。为了确保兼容性,将 RGB 转换为 HSV 的代码应修改为:

cv.CvtColor(frame, frameHSV, cv.CV_BGR2HSV)
登录后复制

更新代码:

import cv

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

ORANGE_MIN = cv.Scalar(5, 50, 50)
ORANGE_MAX = cv.Scalar(15, 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_BGR2HSV)
    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()
登录后复制

结果:

运行更新后的代码可以对橙色进行更准确的分割盖子。

注意:

由于背景色调相似,可能会出现一些小的错误检测。为了解决这个问题,可以应用轮廓分析等进一步处理来隔离与盖子相对应的最大轮廓。

以上是如何在 OpenCV 中选择正确的 HSV 上边界和下边界以进行准确的颜色检测?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板