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

时间:2012-01-26 13:36:34

标签: 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

3 个答案:

答案 0 :(得分:27)

使用cv::inRange()使用必要的颜色边界预处理图像以隔离红色。您可能希望转换为HSV或YCbCr等色彩空间,以获得更稳定的色彩边界,因为色度和亮度可以更好地分离。您可以使用cvtColor()。查看我的回答here,了解将inRange()createTrackbar()一起使用的好例子。

因此,基本模板将是:

Mat redColorOnly;
inRange(src, Scalar(lowBlue, lowGreen, lowRed), Scalar(highBlue, highGreen, highRed), redColorOnly);
detectSquares(redColorOnly);

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

示例:
因此,有关模板的完整示例,请转到

我在GIMP中创建了一个简单(理想)的图像,如下所示: enter image description here

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

#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;
}

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

输出如下:

enter image description here

瞧!只剩下红色方块:)

享受:)

答案 1 :(得分:0)

在这种情况下,请尝试找出所需方块的任何独特功能,以区别于其他方块。

例如,

1)正方形的颜色: - 如果颜色与所有其他正方形不同,您可以在每个正方形内部进行检查,并选择所需颜色的正方形,如mevatron.所述

2)方形尺寸: - 如果您知道方形尺寸,则比较每个方格的大小并选择最佳。

答案 2 :(得分:-1)

您可以使用内置功能将图像从RGB值转换为HSV类型。之后你会发现每种颜色都有一些HSV值范围。因此,您可以找到并将其作为阈值并将这些点与其他点区分开来。