Слияние изображений RGB и глубины из Kinect

Я создаю алгоритм видения, который реализован в S-функции Simulink (код на C ++). Я достиг всего, чего хотел, кроме выравнивания цвета и глубины изображения.

У меня вопрос, как я могу сделать, чтобы 2 изображения соответствовали друг другу. Другими словами, как я могу сделать 3D-изображение с OpenCV.

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

#include "opencv2/opencv.hpp"
using namespace cv;

int main(int argc, char** argv)
{
// reading in the color and depth image
Mat color = imread("whitepaint_col.PNG", CV_LOAD_IMAGE_UNCHANGED);
Mat depth = imread("whitepaint_dep.PNG", CV_LOAD_IMAGE_UNCHANGED);

// show bouth the color and depth image
namedWindow("color", CV_WINDOW_AUTOSIZE);
imshow("color", color);
namedWindow("depth", CV_WINDOW_AUTOSIZE);
imshow("depth", depth);

// thershold the color image for the color white
Mat onlywhite;
inRange(color, Scalar(200, 200, 200), Scalar(255, 255, 255), onlywhite);

//display the mask
namedWindow("onlywhite", CV_WINDOW_AUTOSIZE);
imshow("onlywhite", onlywhite);

// apply the mask to the depth image
Mat nocalibration;
depth.copyTo(nocalibration, onlywhite);

//show the result
namedWindow("nocalibration", CV_WINDOW_AUTOSIZE);
imshow("nocalibration", nocalibration);waitKey(0);
destroyAllWindows;
return 0;
}

вывод программы:

введите описание изображения здесь

Как видно из результатов моей программы, когда я применяю маску onlywhite к изображению глубины, тело четырехквадратного коптера не состоит из одного цвета. Причина этого заключается в том, что между двумя изображениями существует несоответствие.

Я знаю, что мне нужны параметры калибровки моей камеры, и я получил их от последнего человека, который работал с этой настройкой. Сделал калибровку в Matlab и это привело к следующему.

Результаты калибровки Matlab:

Изображения / JwFi5.png

Я потратил много времени, читая следующую страницу opencv о калибровке камеры и 3D реконструкции (не могу включить ссылку из-за обмена стеками lvl)

Но я не могу на всю жизнь понять, как я могу достичь своей цели, добавив правильное значение глубины для каждого цветного пикселя.

Я попытался с помощью reprojectImageTo3D (), но я не могу понять матрицу Q.
Я также попробовал много других функций с этой страницы, но я не могу, чтобы мои входные данные были правильными.

2

Решение

Насколько я знаю, Matlab очень хорошо поддерживает Kinect (особенно для v1). Вы можете использовать функцию с именем alignColorToDepth, следующее:

[alignedFlippedImage,flippedDepthImage] = alignColorToDepth(depthImage,colorImage,depthDevice)

Возвращаемые значения alignedFlippedImage (зарегистрированное изображение RGB) и flippedDepthImage (зарегистрированное изображение глубины). Эти два изображения выровнены и готовы для обработки.

Вы можете найти больше на эта страница документации MathWorks.

Надеюсь, это то, что вам нужно 🙂

1

Другие решения

Насколько я могу судить, вам не хватает преобразования между кадрами координат камеры. Kinect (v1 и v2) использует две отдельные системы камер для захвата данных глубины и RGB, поэтому между ними есть перемещение и вращение. Вы можете предполагать отсутствие ротации, но вам придется учесть перевод, чтобы исправить смещение, которое вы видите.

Попробуйте начать с эта тема.

0

По вопросам рекламы [email protected]