2015-10-16 5 views
2

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

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

output of the program:

enter image description here

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

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

Matlab calibration esults:

https://i.stack.imgur.com/JwFi5.png

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

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

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

+0

Если вы пишете свой собственный Simulink блок, вы можете попробовать сделать это в MATLAB с помощью функционального блока MATLAB. – Dima

ответ

0

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

Попробуйте начать с this thread.

+0

Да, я знаю о недостающем переводе. Именно поэтому я задал вопрос. Протектор, который вы связываете, предлагает использовать kinect api. Это то, что я бы предпочел не делать, поскольку он не способен работать с файлами Mat, насколько мне известно. Кроме того, поскольку мой ввод - файлы Mat, я бы не смог использовать код примера из этого протектора. –

+0

Вы используете Kinect v2? Если это так, вы, вероятно, можете использовать функцию [stereoCalibrate] (http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#findchessboardcorners) в OpenCV, поскольку в RGB и IR появится чек-панель. Если вы используете Kinect v1, вам может понадобиться настроить цель, которую вы можете определить в обоих кадрах, чтобы вычислить преобразование. Кроме того, вы можете просто вручную отрегулировать смещение до тех пор, пока оно не будет удовлетворительным. –

+0

Я использую Kinect V1. Также ручная настройка смещения не является вариантом. Причина в том, что смещение зависит от высоты. Поскольку у меня есть изображение глубины, я бы ожидал, что будет способ вычисления преобразования, зависящего от значения глубины, где он сопоставляет его с правильным пикселем в изображении rgb. –

1

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

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

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

Вы можете найти более подробную информацию о this MathWorks documentation page.

Надежда это то, что вам нужно :)

+0

Извините, я редактировал свой вопрос, чтобы включить, что это должно быть сделано в коде C++. –