Kinect One калибровки / наложения RGB и глубины изображений с OpenCV

Я работаю над проектом, в котором мне нужно будет использовать Kinect One, у меня нет такого большого опыта работы с датчиками такого типа (ни с новым, ни со старым kinect). Поэтому я начал играть с ним, и мне удалось получить изображения, используя Kinect SDK v2.0 и opencv. Теперь я хотел бы наложить два вида с датчика rgb и датчика ir/ глубины, чтобы создать изображение rgb-d. По этой причине Kinect SDK предоставляет класс с именем CoordinateMapper, но он не обеспечивает достаточных результатов (скорость и качество), и я столкнулся с проблемой, описанной здесь@api55. Поэтому я хотел бы попытаться сделать это вручную, а также по соображениям обучения. Цветная камера имеет разрешение Full HD (1920x1080 пикселей), а глубина / инфракрасное изображение составляет 512x424 пикселей соответственно. Плюс два датчика имеют разное соотношение сторон. Обыскав вокруг, я обнаружил, что правильным способом является сначала откалибровать два датчика, а затем применить любое сопоставление между двумя видами.

Я собираюсь использовать opencv для калибровки и картирования. Для калибровки я заметил, что люди здесь и в целом предлагают, что было бы лучше, если бы я сначала индивидуально откалибровал два датчика, используя calibrate() затем использовать извлеченные значения cameraMatrix/intrinsic и коэффициент искажения /distCoeffs для stereoCalibrate() функция для получения матриц вращения (R) и перемещения (T) плюс некоторые другие, например, R1,R2,P1,P2,Q и т. д., необходимые позже для отображения. Используя шаблон сетки асимметричных кругов, мне удалось индивидуально откалибровать каждый датчик в его исходном разрешении и соотношении сторон, получив ошибку перепроецирования, среднеквадратичные значения 0,3 и 0,1 для датчиков RGB и IR соответственно. Передача извлеченных значений в stereoCalibrate() с CV_CALIB_USE_INTRINSIC_GUESS а также CV_CALIB_FIX_INTRINSIC Мне удалось получить матрицы R и T с ошибкой перепроецирования, rms = ~0,4, что также кажется хорошим.


Вопрос 1

Однако прежде чем продолжить, у меня есть вопрос stereoCalibrate() имеет параметр о размере изображения, я использовал размер с ИК-камеры, так как позже я хотел бы использовать это разрешение для сопоставления двух видов. С другой стороны, я где-то читал, что он не играет никакой роли, поскольку он полезен только для инициализации при внутренней калибровке камеры (согласно документации openCV), которая не используется, если stereoCalibrate() вызывается с параметром CALIB_FIX_INTRINSIC это верно? Кроме того, вы думаете, что мне следует изменить размер камеры высокого разрешения до размера меньшего, поскольку позже я буду использовать последнюю для картирования. Я думаю, мне нужно будет применить немного обрезку из-за разного соотношения сторон, верно? или это не обязательно.


Продолжая без изменения размера и обрезки в конце, мне удалось получить всю необходимую информацию, необходимую для искажения и исправления от stereoRectify() функция. Итак, я успешно получил матрицы Matrix, distCoeffs, R, T, R1, R2, P1, P2, Q. Пытаясь теперь не исказить / исправить и переназначить два представления в их начальные размеры, я получил следующий результат:

что кажется довольно хорошим, за исключением кольца вокруг первого изображения, которое я не знаю, что это такое, если кто-то может объяснить мне, я был бы благодарен. Я думаю, что, скорее всего, результат неправильной калибровки? Кроме того, в initUndistortRectifyMap() Я использую сенсор с большим разрешением, в противном случае я получаю что-то совершенно не так, я тоже не понимаю, если кто-то может объяснить.

Теперь, если я изменю размер изображения с большим разрешением перед любой калибровкой (без обрезки), я получаю намного лучшие результаты:

конечно, как вы можете видеть из-за соотношения сторон изображения совершенно разные.


вопрос 2

Итак, еще раз, продолжая с вопроса 1, как правильно поступить, могу ли я использовать изображения в их первоначальном размере или мне следует изменить их размер, следует ли применять также обрезку? Что я делаю не так в процедуре?



Вопрос 3

Учитывая, что мне удастся получить два вида после калибровки / искажения / выпрямления, как мне их наложить? У меня есть изображения как RGB, так и глубины, cameraMatric и distCoeff с обоих датчиков и матриц R, T, R1,R2,P1,P2,Q. Я прочитал, что могу использовать cv::projectPoints, но я не смог найти пример. Я был бы признателен, если бы кто-нибудь простудился дать мне несколько советов.

Заранее спасибо.

PS Я могу предоставить некоторый код, если это необходимо, на данный момент это немного грязно, но все же, если это не поможет мне.

0 ответов

Другие вопросы по тегам