2015-10-16 122 views
2

我創建了一個在Simulink S函數(這是C++代碼)中實現的視覺算法。除了顏色和深度圖像的對齊之外,我完成了所有想要的任務。合併rgb和深度圖像從一個kinect

我的問題是我怎樣才能使2圖像相互對應。換句話說,我如何使用opencv製作3D圖像。

我知道我的問題可能有點模糊,所以我會包括我的代碼,這將解釋的問題

#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的頁面(可以不包括因爲堆棧交換拉特的鏈接)

,但我不能對於我來說,我想知道如何實現向每個彩色像素添加正確深度值的目標。

我試過使用reprojectImageTo3D()但我找不出Q矩陣。 我也嘗試從該頁面分配其他功能,但我似乎無法讓我的輸入正確。

+0

如果你正在寫自己的Simulink模塊,你可以嘗試使用MATLAB功能塊做在MATLAB。 – Dima

回答

0

據我所知,你錯過了相機座標系之間的轉換。 Kinect(v1和v2)使用兩個獨立的相機系統來捕捉深度和RGB數據,因此它們之間存在平移和旋轉。您可能無法進行輪換,但您必須對翻譯進行說明以解決您所看到的錯位問題。

嘗試從this thread開始。

+0

是的,我知道失蹤的翻譯這就是爲什麼我問這個問題。你鏈接的腳步建議使用kinect api。據我所知,這是我不願意做的事情,因爲它無法處理馬特文件。此外,由於我的輸入是Mat文件,我無法使用該步驟中的示例代碼。 –

+0

您使用的是Kinect v2嗎?如果是這樣,您可以在OpenCV中使用[stereoCalibrate](http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#findchessboardcorners)函數,因爲棋盤將顯示在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 + +代碼。 –

相關問題