Определить интервал цвета RGB с помощью OpenCV и С++

Я хотел бы обнаружить красный цвет объекта в видео или изображении с помощью OpenCV и С++. Какие алгоритмы доступны для этого?

Я хотел бы сделать сравнение отношения между уровнями цвета. Действительно, когда яркость меняется, отношение остается постоянным. Поэтому я хочу определить интервал допустимых значений для цветов интересующей зоны.

Для случаев я смотрю на красные 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, couleur (x, y) = blanc else couleur (x, y) = NOIR

Ответ 1

Предварительно обработать изображение, используя cv:: inRange() с необходимыми границами цвета, чтобы изолировать красный цвет. Вы можете преобразовать в цветовое пространство, такое как HSV или YCbCr, для более стабильных границ цвета, потому что цветность и яркость лучше разделены. Вы можете использовать cvtColor() для этого. Посмотрите мой ответ здесь за хороший пример использования inRange() с createTrackbar().

Итак, основным шаблоном будет:

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

РЕДАКТИРОВАТЬ: Просто используйте трекболы, чтобы определить диапазон цвета, который вы хотите изолировать, а затем используйте интервалы цвета, которые вы обнаружите, что работаете. Вам не обязательно постоянно использовать трекболы.

ПРИМЕР:
Итак, для полного примера шаблона здесь вы идете,

Я создал простой (и идеальный) образ в 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

Voila! Остается только красный квадрат:)

Наслаждайтесь:)

Ответ 2

В этом случае попробуйте найти любую уникальную функцию для вашего квадрата, который отличает его от других квадратов.

Например,

1) Цвет квадрата: - Если цвет отличается от всех других квадратов, вы можете проверить внутри каждого квадрата и выбрать квадрат с требуемым цветом, как объясняется mevatron.

2) Размер квадрата: - Если вы знаете размер квадрата, сравните размер каждого квадрата и выберите лучший.

Ответ 3

Вы можете преобразовать свое изображение из значения RGB в тип HSV, используя встроенную функцию. После того, как вы обнаружите, что у каждого цвета есть диапазон значений HSV. Таким образом, вы можете найти это и дать это как порог и дифференцировать эти точки от других.