#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)