C++ 具有相似颜色背景的OpenCV颜色检测

C++ 具有相似颜色背景的OpenCV颜色检测,c++,opencv,C++,Opencv,我使用OpenCV从具有不同背景和光照条件的图像中检测红色区域: A) 理想条件: B) 相似颜色背景: C) 弱光: 我主要尝试在Range中使用。首先在BGR颜色空间中,提取最小红色值约为200的像素。这在A和B中效果良好,但在C(弱光)中效果不佳。我尝试将图像转换为HSV,并对红色进行inRange(借用): 它适用于A和C,但不适用于B 哪种方法最好 谢谢 我认为最好的方法是训练分类器(神经网络,svm,…),使用颜色分量值作为特征对对象/背景进行分类。它应该适用于3D点(R、G、

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

A) 理想条件:

B) 相似颜色背景:

C) 弱光:

我主要尝试在Range中使用
。首先在BGR颜色空间中,提取最小红色值约为200的像素。这在AB中效果良好,但在C(弱光)中效果不佳。我尝试将图像转换为HSV,并对红色进行
inRange
(借用):

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

哪种方法最好


谢谢

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

IMHO,您应该添加除颜色以外的更多推理。颜色是非常基本(但可以作为第一步使用)和有限类型的对象识别工具,因为无法保证背景中没有类似的颜色。例如,对于机器视觉来说,添加图像分割或形状检测几乎总是错误的颜色空间。HSV是一个很好的方法-您可能需要根据整体亮度调整范围,因为相机的响应

谢谢@Martin。HSV的问题在于背景颜色非常相似(参见问题中的图像B)。在这种情况下,根据整体亮度调整范围是否有帮助?是的,这是hsv的想法,如果色调相同,您可以使用亮度来区分它们。在这种情况下,您还可以使用直方图来确定常见的HSV像素是背景,较少见的是ObjectThank@Andrey。当然,分类器听起来是一种稳健的方法,但我担心,与其他解决方案相比,理解如何使用它并培训它所需的时间是值得的。另外,您能推荐其他代码示例吗?我刚刚花了两个小时试图编译
points\u classifier.cpp
。原来它使用的是当前OpenCV 2.4.9框架二进制文件中没有的
ml.hpp
版本。谢谢@Samer。那么,您建议使用哪些其他工具,哪些工具适合所有场景?我尝试过使用形状检测,但在光线条件较低时效果不太好(参见问题中的图像B)。@Eric,你考虑过吗?
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;