使用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一个简单的(理想)的图像,如下图所示:
然后我创造了这个程序来过滤所有,但红色方块:
#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;
}
注意:您将无法将这些完全相同的滤镜间隔用于实际图像;我只是建议你调整跟踪栏的间隔,看看什么是可以接受的。
输出看起来是这样的:
瞧!只有红色正方形仍然:)
享受:)
请在你的问题中添加像图像等更多的细节。这很难理解。 –
请让我可以和某人在skyp上说更多详情? – SOS
如果你想聘请某人,请在twitter上找到我。 :) – karlphillip