Преобразование изображения глубины из миллиметра в метры в OpenCV

#opencv #ros

#opencv #ros

Вопрос:

Это кажется действительно простым, но я получаю ошибку при обработке изображений OpenCV. Входное изображение представляет собой изображение глубины, имеющее CV_16UC1 кодировку (значения глубины указаны в миллиметрах). Я хочу преобразовать значения глубины в метры, как показано ниже-

 auto img_m = img_mm * 0.001f; // convert to meter (SI units)
  

Наконец, мне нужны значения глубины в несколько пикселей. Поэтому я использую mat.at() функцию следующим образом-

 // let say we want to get the depth value at (0, 0)
int pixel_x = 0;
int pixel_y = 0;
auto depth = img_m.at<unsigned short>(pixel_y, pixel_x);
  

К сожалению, он показывает следующую ошибку компиляции-

 error: ‘class cv::MatExpr’ has no member named ‘at’
       auto depth = img_m.at<unsigned short>(pixel_y, pixel_x);
  

Из любопытства я проверил тип данных обоих изображений и обнаружил следующее-

 std::cout << "cvtype(img_mm): " << img_mm.type() << std::endl;
std::cout << "size(img_mm): " << img_mm.size() << " size(img_m): " << img_m.size() << std::endl;
std::cout << "type(img_mm): " << typeid(img_mm).name() << " type(img_m): " << typeid(img_m).name() << std::endl;

cvtype(img_mm): 2
size(img_mm): [640 x 480] size(img_m): [640 x 480]
type(img_mm): N2cv3MatE type(img_m): N2cv7MatExprE
  

Здесь мы видим img_m N2cv7MatExprE , что это вызывает ошибку компиляции.

В качестве обходного пути, вместо преобразования img_mm в img_m , я умножаю значение глубины следующим образом-

 auto depth_mm = img_mm.at<unsigned short>(pixel_y, pixel_x);
auto depth_m = depth_mm * 0.001f; // convert to meter (SI units)
  

Однако я хочу знать, почему скалярное умножение сходит с ума!!!

Ниже приведены сведения об окружающей среде-

  • Ubuntu 14.04 LTS OS
  • ROS Indigo (OpenCV по умолчанию поставляется вместе с ROS)
  • OpenCV 2.4.8
  • CMAKE_CXX_COMPILER_VERSION 4.8.5

Комментарии:

1. Не используйте auto , например cv::Mat1f img_m = img_mm * 0.001f;

Ответ №1:

Вы используете auto , чтобы позволить компилятору вывести тип for img_m , а компилятор правильно выводит его как cv::MatExpr . Умножение cv::Mat и sclalar приводят к cv::MatExpr тому, что это может быть приведено к cv::Mat . Чтобы избежать этой проблемы, вы должны указать тип для img_m :

 cv::Mat img_m = img_mm * 0.001f; // convert to meter (SI units)