Редактировать: Как указал @MSalters, первая половина моего ответа была ошибочной и из-за неправильного прочтения кода ОП.Вторая половина содержит правильный ответ.
Если ваш диапазон глубины составляет 1-3,5 м, измеряется в миллиметрах (1000–3500 мм);деление результата на 1000 даст вам данные в диапазоне 1,0-3,5.Однако ваши исходные данные относятся к 16-битному типу без знака, который не может представлять десятичные значения или значения с плавающей запятой, только целые числа, поэтому ваши значения усекаются до одного из {0,1,2,3}.Вы могли бы обойтись без этого в convertTo
, поскольку это может привести к внутреннему маршалированию типов, но это потенциальный источник ошибки.
Хотя есть вторая проблема ... CV_8U
- это 8-битный символ без знака, который также может представлять только целочисленные значения, на этот раз в диапазоне от 0 до 255.Поскольку ваши данные могут находиться в диапазоне 0 ... 3500, умножив на 0,255, как вы делаете в своем примере, все, что превышает 1000 мм глубины, приводит к значению более 255 и, таким образом, усекается там.
Вместо преобразования необработанного изображения глубины, как указано выше, вы можете использовать функцию cv :: normalize с типом нормализации NORM_MINMAX
, чтобы нормализовать ваши данные до 0... 255 дальность.Вы также можете установить формат изображения назначения в CV_8U.
Это, вероятно, подходит только для визуализации, поскольку на него будет влиять диапазон ввода исходных данных.Вместо этого, если вы знаете, что максимальное значение равно 3500, а минимальное значение равно 0, разделите исходное изображение на 3500 и умножьте на 255. При этом, по возможности, лучше всего сохранить его в 16-битном формате радиразрешение по глубине.