2015-03-10 7 views
1

Каких опций правильнокак получить доступ к значению различия в OpenCV

disparity.at<short>(X,Y) 
disparity.at<uchar>(X,Y) 

ли мы разделить неравенство на 16,0, чтобы получить правильное неравенство. Некоторые люди в своем блоге используют 1. Некоторые из них использовали 2. Тип короткий, используя функцию disparity.type(). Значение неравенства, которое я получаю при доступе к использованию 1, очень велико.

+0

Я не вижу никакой разницы между 1 и 2. Мне что-то не хватает? – GPPK

+0

Извините, пропустил это ... я увлекаюсь ... Я писал внутри <> без использования опции вставки кода –

+0

, откуда вы получили значения несоответствия? Библиотеки захвата Kinect обычно предоставляют 16-битные значения без знака (но глубина, а не различие), которые будут «.at ». Другие методы могут вычислять значения «» или даже «» или что-то еще. Вы можете попробовать распечатать 'disparity.depth' и сообщить нам. Еще одна вещь, которая стоит упомянуть: если ваши X и Y являются символами изображения X и Y, то ваш доступ неправильный и должен быть либо '.at (Y, X)', либо '.at (cv :: Point (X, Y)) ' – Micka

ответ

3

Если вы используете OpenCV 2.4.x вы должны смотреть на http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#stereobm-operator, который говорит вам:

неравенство - Выходная карта несоответствий. Он имеет тот же размер, что и входные изображения. Когда disptype == CV_16S, карта представляет собой 16-разрядное одноканальное одностороннее изображение, содержащее значения несоответствия, масштабированные на 16. Чтобы получить истинные значения несоответствия из такого представления с фиксированной точкой, вам необходимо разделить каждый элемент disp на 16. Если disptype == CV_32F, карта несоответствия будет уже содержать реальные значения несоответствия на выходе.

Так что, если вы выбрали disptype = CV_16S в процессе вычислений, вы можете получить доступ к пиксель в пиксель-позиции (X, Y) по:

short pixVal = disparity.at<short>(Y,X); 

в то время как значение диспропорция

float disparity = pixVal/16.0f; 

, если вы выбрали disptype = CV_32F при вычислении, вы можете получить доступ к несоответствию напрямую:

float disparity = disparity.at<float>(Y,X); 

Доступ к матрице неравенства с определенно должен быть неправильным!

Имейте в виду, что могут быть различия для разных версий OpenCV!

+1

Спасибо за ответ .... Я использовал (X, Y) вместо (Y, X) и получал ошибки deg .... Спасибо большое –

+0

получайте удовольствие! Это немного запутанно, что '.at' обращается к порядку' (Y, X) ', но это потому, что это соглашение о матрице и математической матрице заключается в индексировании строки перед столбцом. Хотя изображения обычно имеют X-Axis - сначала для доступа к пикселю. – Micka

1

С StereoBM выходное несоответствие может быть CV_16S или CV_32F. Если тип несоответствия равен CV_16S, то это 16-разрядное одноканальное изображение со знаком, содержащее значения несоответствия, масштабированные на 16. Чтобы получить истинные значения несоответствия из такого представления с фиксированной точкой, вам нужно будет разделить каждый элемент на 16. Если тип несоответствия - CV_32F, то карта различий уже будет содержать реальные значения несоответствия на выходе.