使用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