使用OpenCV和C++检测RGB颜色间隔

SOS*_*SOS 4 opencv

我想用OpenCV和C++检测视频或图像中的红色对象.有什么算法可以做到这一点?

我想比较一下颜色的关系.实际上,当亮度变化时,比率保持不变.所以我想确定感兴趣区域颜色的可接受值的间隔.

对于情况,我看红R(x,y)和G(x,y)/ R(x,y)和B(x,y)/ R(x,y).

然后,我将找到可接受值的范围:为了获得第一个想法,它从调色板图像红色中释放每个报告的最大值和最小值

我想找到这样的东西:

如果minR <= R(x,y)<= maxR且minG <= G(x,y)<= maxG minB <= B(x,y)<= maxB so couleur(x,y)= blanc else couleur( X,Y)= NOIR

mev*_*ron 27

使用cv :: inRange()对图像进行预处理,并使用必要的颜色边界来隔离红色.您可能希望转换为HSV或YCbCr等色彩空间,以获得更稳定的色彩边界,因为色度和亮度可以更好地分离.你可以使用cvtColor().看看我的答案在这里使用的一个很好的例子inRange()createTrackbar().

所以,基本模板将是:

Mat redColorOnly;
inRange(src, Scalar(lowBlue, lowGreen, lowRed), Scalar(highBlue, highGreen, highRed), redColorOnly);
detectSquares(redColorOnly);
Run Code Online (Sandbox Code Playgroud)

编辑:只需使用轨迹栏确定要隔离的颜色范围,然后使用找到的颜色间隔.您不必经常使用轨道栏.

示例:
那么,有关模板的完整示例,请转到

我在GIMP中创建了一个简单(和理想)的图像,如下所示: 在此输入图像描述

然后我创建了这个程序来过滤除红色方块以外的所有方块:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

using namespace std;
using namespace cv;

Mat redFilter(const Mat& src)
{
    assert(src.type() == CV_8UC3);

    Mat redOnly;
    inRange(src, Scalar(0, 0, 0), Scalar(0, 0, 255), redOnly);

    return redOnly;
}

int main(int argc, char** argv)
{
    Mat input = imread("colored_squares.png");

    imshow("input", input);
    waitKey();

    Mat redOnly = redFilter(input);

    imshow("redOnly", redOnly);
    waitKey();

    // detect squares after filtering...

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

注意:您将无法对实际图像使用这些完全相同的滤镜间隔; 我建议您使用轨迹栏调整间隔以查看可接受的内容.

输出如下所示:

在此输入图像描述

瞧!只有红场仍然是:)

请享用 :)

  • 为什么不升级到OpenCV 2.3.1?这个例子怎么样对你不起作用?`inRange`在OpenCV 2.1中可用,所以`Mat`对象... (2认同)
  • 只需将includes切换到`#include <opencv/cv.h>`,然后删除`<opencv2/*/*.hpp>`行. (2认同)