Определите цветовой интервал 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. Таким образом, вы можете найти это и дать это в качестве порога и отличить эти точки от других.