我想用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
答案 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中创建了一个简单(理想)的图像,如下所示:
然后我创建了这个程序来过滤掉除红色方块之外的所有内容:
#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;
}
注意:您将无法对实际图像使用这些完全相同的滤镜间隔;我建议您使用轨迹栏调整间隔,以查看可接受的内容。
输出如下:
瞧!只剩下红色方块:)
享受:)
答案 1 :(得分:0)
在这种情况下,请尝试找出所需方块的任何独特功能,以区别于其他方块。
例如,
1)正方形的颜色: - 如果颜色与所有其他正方形不同,您可以在每个正方形内部进行检查,并选择所需颜色的正方形,如mevatron.所述
2)方形尺寸: - 如果您知道方形尺寸,则比较每个方格的大小并选择最佳。
答案 2 :(得分:-1)
您可以使用内置功能将图像从RGB值转换为HSV类型。之后你会发现每种颜色都有一些HSV值范围。因此,您可以找到并将其作为阈值并将这些点与其他点区分开来。