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

Я хотел бы обнаружить объект красного цвета в видео или изображении с помощью 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, поэтому couleur(x,y)=blanc else couleur(х, у) = НУАР

3 ответа

Предварительно обработайте изображение с помощью 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;
}

ПРИМЕЧАНИЕ. Вы не сможете использовать точно такие же интервалы фильтрации для ваших реальных изображений; Я просто предлагаю вам настроить интервалы с помощью трекбаров, чтобы увидеть, что приемлемо.

Вывод выглядит так:

введите описание изображения здесь

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

Наслаждаться:)

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

Например,

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

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

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

Другие вопросы по тегам