Ответ 1
Предварительно обработать изображение, используя cv:: inRange() с необходимыми границами цвета, чтобы изолировать красный цвет. Вы можете преобразовать в цветовое пространство, такое как HSV или YCbCr, для более стабильных границ цвета, потому что цветность и яркость лучше разделены. Вы можете использовать cvtColor() для этого. Посмотрите мой ответ здесь за хороший пример использования 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;
}
ПРИМЕЧАНИЕ.. Вы не сможете использовать эти точные интервалы фильтра для ваших реальных изображений; Я просто предлагаю вам настроить интервалы с трекболами, чтобы увидеть, что приемлемо.
Результат выглядит следующим образом:
Voila! Остается только красный квадрат:)
Наслаждайтесь:)