2016-05-15 6 views
0

Я пытаюсь сделать отслеживание объектов с помощью OpenCV 3.1.0 и C++, следующих за этим примером Python: http://docs.opencv.org/3.1.0/df/d9d/tutorial_py_colorspaces.html#gsc.tab=0.OpenCV - cvtColor не изменяет цветовое пространство, он меняет цвета

У меня есть некоторые проблемы с функцией cvtColor(), поскольку он меняет цвета моих изображений, а не его цветовое пространство. У меня есть этот код:

Mat original_image; 
original_image = imread(argv[1], CV_LOAD_IMAGE_COLOR); // The image is passed as arg 
if (!original_image.data) 
{ 
    printf("Problem!\n"); 
    return -1; 
} 

// From BGR to HSV 
Mat hsv_image(original_image.rows, original_image.cols, original_image.type()); 
cvtColor(original_image, hsv_image, CV_BGR2HSV); 
imwrite("hsv_image.png", hsv_image); 

original_image является CV_8UC3, совместимый с cvtColor() и должен быть первоначально в BGR цветовом.

Я сделал тестовое изображение ниже с GIMP:

Test image

И я получаю это изображение как результат:

HSV image - result

я решил попробовать преобразование из BGR в RGB, меняя BGR2HSV на BGR2RGB, и с тем же тестовым изображением, получаю этот результат

RGB image - result

Вот, это более ясно, что каналы изображения изменяются непосредственно ...

Кто-нибудь какие-либо идеи о том, что здесь происходит?

+2

На втором изображении, вы интерпретации каналов [HSV изображения] (https://en.wikipedia.org/wiki/HSL_and_HSV) (то есть Hue, Saturation, Value) как синий, зеленый и красный соответственно. Что вы ожидали получить в результате (imwrite ожидает BGR)? –

+0

В основном вы не заметили эту важную информацию в документации ['imwrite()'] (http://docs.opencv.org/3.0-beta/modules/imgcodecs/doc/reading_and_writing_images.html#imwrite): " С помощью этой функции можно сохранить только 8-битные ... 3-канальные (с порядком канала BGR). " –

+0

Спасибо тебе большое! Я действительно не проверял это, я думал, что проблема была в преобразовании, и я не проверял функцию imwrite(). Еще раз спасибо! – user3368457

ответ

1

imwrite Функция не все равно, что цветовое пространство мат имеет и эта информация не хранится. Согласно документации, это заказ BGR.

Поэтому перед сохранением изображения вы должны быть уверены, что это BGR.

Если вы действительно хотите, чтобы сохранить изображение HSV использовать file storages

-1

Попробуйте это:

// From BGR to HSV 
Mat hsv_image; 
cvtColor(original_image, hsv_image, COLOR_BGR2HSV); 
imwrite("hsv_image.png", hsv_image); 
+0

Это будет иметь тот же эффект, что и последние 3 строки в примере OP. Он также не отвечает на его вопрос, который не понимает, почему сохранение изображения HSV с 'imwrite' возвращает глупость. –

Смежные вопросы