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 Я могу предоставить некоторый код, если это необходимо, на данный момент это немного грязно, но все же, если это не поможет мне.