На веб-сайте colorizer.org у них есть диапазон HSV H = 0-360, S = 0-100, V = 0-100. Мы также знаем, что диапазон HSV в OpenCV равен H = 0-180, S = 0-255, V = 0-255.Почему функция inRange не обнаруживает синий цвет, когда я дал ему весь возможный диапазон оттенков для синего цвета?
Я хотел выбрать диапазон для любого оттенка (что мы воспринимаем как) синего цвета, поэтому я посмотрел на colorizer.org и увидел, что синий оттенок варьируется примерно от 170 до 270. Поэтому я масштабировал этот диапазон оттенков до OpenCV делением на 2, что дает 85-135.
Теперь я взял следующий скриншот цвета [H=216, S=96, V=67]
от просмотра на сайте
Затем я запустить приложение на своем телефоне и захватили следующие кадр камеры с экрана ноутбука. Я понимаю, что значения канала HSV будут отличаться от тех, на веб-сайте, в некоторой степени, потому что существуют и другие условия, как дополнительный свет (V в HSV) в комнате, когда я захваченной кадр камеры и т.д.
Затем я преобразовал это Mat
в цветовое пространство HSV на Imgproc.cvtColor(rgbaFrame, hsvImage, Imgproc.COLOR_RGB2HSV_FULL);
, что привело к следующему изображению.
Тогда я назвал inRange
функцию:
Core.inRange(hsvImage, new Scalar(85, 50, 40), new Scalar(135, 255, 255), maskedImage);
что привело к следующим maskedImage.
Вопрос заключается в том, что почему он не обнаруживает синий цвет, когда я включил все Hue Range возможно синего цвета на самом деле?
ВАЖНО: За исключением первого исходного изображения, все изображения были сохранены в SDCard с помощью Highgui.imwrite
функции, так что я мог бы переместить их на свой компьютер, чтобы загрузить их на Stackoverflow. Вы, должно быть, заметили, что синий цвет в первом исходном скриншоте преобразуется в красный цвет во втором изображении. Причина в том, что кадр, снятый камерой (то есть фото/кадр первого снимка экрана, снятый камерой мобильного телефона), является изображением RGBA. Но OpenCV по умолчанию конвертирует все изображения в BRG, когда он сохраняет их на SD-карте. Поэтому будьте уверены, что исходное изображение RGBA, и оно полностью преобразуется в BGR внутри OpenCV для сохранения в SD-карте. Вот почему красный цвет выглядит синим.
не ваше фото красный и черный .. где синий? –
@HumamHelfawi Исходное фото - синее и черное, это было на моем компьютере. Посмотрите первое изображение. Это фотография. Я открыл его в Windows Photo Viewer на своем компьютере и захватил его с помощью своего телефона (на котором было запущено приложение Android). Захваченное фото - это второе изображение. Я сохранил его в своей SD-карте «Highgui.imwrite («/mnt/sdcard/DCIM/rgbaFrameCaptured.jpg », rgbaFrameCaptured); // check'. В нем синий цвет. Кроме того, вы видите этот беловатый фон, это было окружающее пространство вокруг фотографии, открытое в Windows Photo Viewer. – Solace
@HumamHelfawi Пожалуйста, проигнорируйте преобразование синего в красный во втором изображении, потому что RGBA преобразуется в BGR, когда мы храним изображение, и я сохранил его на SD-карте, чтобы я мог перенести его на свой ноутбук, чтобы загрузить его на SO , Изображение на самом деле является RGBA (я знаю это, потому что этот кадр камеры возвращается функцией rgba() класса OpenCVCameraViewBridge, и согласно документации возвращается изображение rgba) – Solace