2016-08-09 2 views
0

У меня есть float x, float y, float z значения изображения. Я хочу построить 16-битное изображение глубины png, скопировав значения z. Изображение, которое я получаю в результате, имеет некоторые недопустимые точки. Ниже мой код.Создание мата из данных необработанного буфера

uint16_t* depthValues = new uint16_t[size]; 
auto sampleVector(DepthPoints); 
for (unsigned int i = 0; i < sampleVector.size(); i++) 
    { 
     depthValues[i] = (sampleVector.at(i).z) * 65536; 
    } 
    Mat newDepthImage = cv::Mat(var.height, var.width, CV_16UC1,depthValues); 
imwrite(Location, CImage); 

Может кто-нибудь сказать мне, если я могу скопировать значения с плавающей запятой в беззнаковый массив символов для создания образа? Именно поэтому у моего изображения есть недопустимые баллы?

+0

Какой «результат имеет некоторые недействительные точки» означает именно? Является ли диапазон значений z '[0 - 1]'? Если z имеет значения '> 1', все выше 1 будет 65535. – DimChtz

+0

некоторые области изображения темные. Я не был уверен, можно ли скопировать данные float в 'uint16_t *'. Это то, как мы можем создать изображение глубины? – MThomas

+0

Каков диапазон значений 'z'? Возможно, все, что вам нужно, это 'depthValues ​​[i] = static_cast (sampleVector.at (i) .z);' BTW, x, y, z относится к R, G, B? – DimChtz

ответ

0
auto sampleVector(DepthPoints); 
const int size = sampleVector.size(); 
float* depthValues = new float[size]; 
for (unsigned int i = 0; i < sampleVector.size(); i++) 
    { 
     depthValues[i] = (sampleVector.at(i).z); 
    } 
Mat depthImageOne, depthImageTwo; 
Mat depthImageNew = cv::Mat(var.height, var.width, CV_32FC1,depthValues); 
normalize(newDepthImageNew, depthImageOne, 1, 0, NORM_MINMAX, CV_32FC1); 
depthImageOne.convertTo(depthImageTwo, CV_16UC1, 65536.0,0.0); 
imwrite("path", depthImageTwo); 

Нормализация может привести к потере информации о глубине. Я использовал нормализацию для визуализации изображений. Чтобы сохранить информацию о глубине, я использовал приведенный ниже код.

Mat depthImageNew = cv::Mat(var.height, var.width, CV_32FC1,depthValues); 
depthImageOne.convertTo(depthImageTwo, CV_16UC1, 1000.0,0.0); 
Смежные вопросы