Значения глубины не имеют смысла R200 Camera - PullRequest
0 голосов
/ 08 октября 2018

Я запускаю учебник, найденный здесь: https://software.intel.com/en-us/articles/using-librealsense-and-opencv-to-stream-rgb-and-depth-data

Он получает значения глубины от r200, используя следующие строки:

   cv::Mat depth16( _depth_intrin.height, _depth_intrin.width, CV_16U,(uchar *)_rs_camera.get_frame_data( rs::stream::depth ) );
   cv::Mat depth8u = depth16;
   depth8u.convertTo( depth8u, CV_8UC1, 255.0/1000 );
   imshow( WINDOW_DEPTH, depth8u );

И выходное изображение steam:

https://imgur.com/EmdhFNk

Вы также можете видеть цветное изображение.Я также поместил рулетку через дно, которая достигает 3,5 м (диапазон для r200 должен быть до 3,5 м)

Почему на земле это двоичный цвет?Я пытался добавить разные цветные изображения, но это, похоже, не значения глубины вообще.Также нет никакого смысла в том, что пол постоянно черный, хотя он простирается от 1 до 5 метров.Почему все объекты белые?Стол и диван, очевидно, находятся на разном расстоянии.

Как мне это улучшить?Я знаю, что вы можете получить хорошие значения глубины от r200, как я получаю их в примерах.См. (http://docs.ros.org/kinetic/api/librealsense/html/cpp-capture_8cpp_source.html), но они используют glfw в отличие от OpenCV. Мне интересно, почему значения глубины становятся такими странными после их преобразования.

В идеале я хотел бы генерировать значения глубины и фильтровать любыевне диапазона от 1 до 2 м. Спасибо!

1 Ответ

0 голосов
/ 08 октября 2018

Редактировать: Как указал @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-битном формате радиразрешение по глубине.

...