【问题标题】:OpenCV color detection with similar color background具有相似颜色背景的 OpenCV 颜色检测
【发布时间】:2014-11-14 13:31:58
【问题描述】:

我正在使用 OpenCV 从具有不同背景和光照条件的图像中检测红色区域:

A) 理想条件:

B) 相似颜色背景:

C) 弱光:

我主要尝试使用inRange。首先在 BGR 颜色空间中,通过提取最小红色值约为 200 的像素。这在 AB 中效果很好,但在 C强>(弱光)。我尝试将图像转换为 HSV 并为红色执行 inRange(借用 here):

Mat imgThresholded;
Mat imageHSV;
cvtColor(src, imageHSV, CV_BGR2HSV);

int iLowH = 0;
int iHighH = 50;

int iLowS = 100;
int iHighS = 255;

int iLowV = 80;
int iHighV = 255;

inRange(imageHSV,
        Scalar(iLowH, iLowS, iLowV),
        Scalar(iHighH, iHighS, iHighV),
        imgThresholded);

return imgThresholded;

这适用于 AC,但不适用于 B

哪种方法最好?

谢谢!

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    我认为最好的方法是训练分类器(神经网络、支持向量机、...),使用颜色分量值作为特征对对象/背景进行分类。它应该适用于 3D 点(R、G、B - 值将是坐标)。作为起点,我推荐标准 opencv 的示例 points_classifier.cpp(位于 examples/cpp 文件夹中)。

    【讨论】:

    • 谢谢@Andrey。当然,分类器听起来像是一种强大的方法,但我担心与其他解决方案相比,了解如何使用它然后训练它所需的时间是值得的。另外,您能否推荐其他代码示例?我只花了两个小时试图让points_classifier.cpp 编译。原来它使用的ml.hpp 版本不在当前的 OpenCV 2.4.9 框架二进制文件中。
    【解决方案2】:

    恕我直言,您应该添加除颜色之外的更多推理。颜色是非常基本的(但它可以用作第一步)和有限类型的对象识别工具,因为不能保证您的背景中没有任何东西具有相似的颜色。比如添加图像分割link,或者形状检测link

    【讨论】:

    • 谢谢@Samer。那么您会推荐使用哪些其他工具,哪些工具适合所有场景?我尝试过使用OpenCV's Canny algorithm 进行形状检测,但在光线不足的情况下效果不佳(参见问题中的图片B)。
    • @Eric,你考虑过Template Matching吗?
    【解决方案3】:

    RGB 几乎总是机器视觉的错误色彩空间。 HSV 是一种很好的方法 - 由于相机的响应,您可能需要根据整体亮度调整范围

    【讨论】:

    • 谢谢@Martin。 HSV 的问题在于背景颜色非常相似(参见问题中的图像 B)。在这种情况下,根据整体亮度调整范围是否有帮助?
    • 是的,这就是hsv的想法,如果色调相同,您可以使用亮度来区分它们。在这种情况下,您还可以使用直方图来确定常见的 HSV 像素是背景,稀有的是对象
    猜你喜欢
    • 2020-08-17
    • 1970-01-01
    • 2023-03-03
    • 2017-09-04
    • 2011-11-23
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 2017-11-09
    相关资源
    最近更新 更多