2012-03-06 4 views
0

У меня есть тип 6 (двузначное, один канал) мат с данными в диапазоне от 0 до 255. Я могу распечатать данные, используя следующий код:OpenCV двойной мат показывает, как все белые

double* data = result.ptr<double>(); 

    for(int i = 0; i < rows; i++) 
     for(int j = 0; j < cols; j++) 
    std::cout<<data[i*step+j]<<"\t"; 

И это выглядит совершенно нормально - в диапазоне от 0 до 255 и от размера, которого я ожидал бы. Однако, когда я пытаюсь показать изображение:

imshow(window_name, result); 
waitKey(); 

Я просто получаю белое изображение. Просто белые пиксели. Ничего больше.

Загрузка других изображений из файлов и отображение в окне прекрасно работает.

Использование Windows 7, OpenCV 233

+0

Это похоже на код C++, почему бы вам не добавить тег C++? – karlphillip

ответ

1

Вы должны нормализовать с плавающей точкой изображения таким образом, что значения между 0,0 - 1,0, если вы используете imshow. Уверен, что ваши значения превышают 1.0, и, таким образом, эти пиксели установлены на 255, что дает вам белое изображение.

+1

Да, это было. Огромное спасибо. – Jason

2

cv::imshow работает в следующих способов -

  1. Если изображение 8-битовое беззнаковое, она отображается как есть.
  2. Если изображение 16-разрядное без знака или 32-битное целое число, пиксели делятся на 256. То есть диапазон значений [0,255 * 256] отображается на [0,255].
  3. Если изображение представляет собой 32-разрядную плавающую точку, значения пикселей умножаются на 255. То есть диапазон значений [0,1] отображается на [0,255].

Ваша матрица находится в 3-й категории, где imshow ожидает, что значения находятся между 0 и 1, и поэтому она умножает ее на 255. Поскольку ваши значения уже находятся в диапазоне от 0 до 255, вы получаете нежелательный результат. Таким образом, нормализация пикселей между 0 и 1 будет работать.

+1

Спасибо за все уточнения. Лучший ответ до сих пор! –

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