2015-10-16 152 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 + +代码。 –

相关问题