使用 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中文网其他相关文章!