2012-01-26 70 views
4

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

我想做一个颜色水平之间的关系比较。事实上,当亮度变化时,比例保持不变。所以我想确定感兴趣区域的颜色的可接受值的间隔。对于我看红色R(x,y)和G(x,y)/ R(x,y)和B(x,y)/ R(x,y)的情况。

我会再找个可接受值的范围:得到一个最初的想法, 它释放了从调色板图像 红色

每个报告的最大和最小,我想找到这样的事情:

如果MINR < = R(X,Y)< = MAXR明< = G(X,Y)< = maxG MINB < = B(X,Y)< = MAXB所以 传送彩色与存储(X ,y)= blanc else couleur(x,y)= NOIR

+0

请在你的问题中添加像图像等更多的细节。这很难理解。 –

+0

请让我可以和某人在skyp上说更多详情? – SOS

+4

如果你想聘请某人,请在twitter上找到我。 :) – karlphillip

回答

0

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

对于例如

1)正方形的颜色: - 如果颜色是从所有其他方块不同,可以检查每个正方形内,并选择具有所需的颜色方,如由mevatron.

2所说明)正方形的大小: - 如果您知道正方形的大小,那么比较每个正方形的大小并选择最佳。

+0

非常感谢,但我需要检测到一个正方形后检测颜色,所以我使用示例opencv square.c来检测所有的正方形,但现在我需要在一个正方形中检测红色beetwen一些其他我可以做的吗? – SOS

+0

我不知道我明白你的问题。最好在你的问题中添加你的图像,以便问题清楚。无论如何,一旦你知道正方形的位置,取每个像素并检查它是否落在红色区域。 –

+0

请想法是如何我可以在图像中的所有广场之间的广场,因为在此之后,我会做承认,这就是为什么我需要只提取我需要的广场 – SOS

26

使用cv::inRange()预处理图像,并使用必要的颜色范围来隔离红色。您可能想要转换为像HSV或YCbCr这样的色彩空间,以获得更稳定的色彩边界,因为色度和亮度可以更好地分离。您可以使用cvtColor()。看看我的回答here是一个使用inRange()createTrackbar()的好例子。

因此,基本的模板将是:

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

编辑:只需使用trackbars确定要隔离的颜色范围,然后用彩色间隔,你会发现工作。您不必经常使用轨道条。

例:
所以,这里的模板的一个完整的例子,你去,

我创建了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

瞧!只有红色正方形仍然:)

享受:)

+0

谢谢,但我会在real_time处理中使用这个程序,所以我不能使用trackbar,因为这个想法是检测polygone中的红色数字,你有什么想法,我可以做什么! – SOS

+0

@SarraAhmed见编辑... – mevatron

+0

你能给我一个教程或代码来帮助我!请 – SOS

-1

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

+2

你能提供一个与OP想要的东西有关的例子吗?这真的会有帮助... – NREZ