从kinect合并rgb和深度图像 我创建了一个在Simulink S函数(C++代码)中实现的视觉算法。我完成了所有想要的事情,除了颜色和深度图像的对齐

从kinect合并rgb和深度图像 我创建了一个在Simulink S函数(C++代码)中实现的视觉算法。我完成了所有想要的事情,除了颜色和深度图像的对齐,c++,matlab,opencv,computer-vision,matlab-cvst,C++,Matlab,Opencv,Computer Vision,Matlab Cvst,我的问题是如何使这两个图像相互对应。换句话说,如何使用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_

我的问题是如何使这两个图像相互对应。换句话说,如何使用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;
}
:

从我的程序输出中可以看出,当我将onlywhite遮罩应用于深度图像时,四架直升机的机身并非由1种颜色组成。原因是两个图像之间存在未匹配

我知道我需要我相机的校准参数,我从上一个使用此设置的人那里得到了这些参数。在Matlab中进行校准,结果如下

:

我已经花了一定的时间阅读了以下关于相机校准和3D重建的opencv页面(由于堆栈交换lvl,无法包含链接)

但我一辈子都不知道如何才能实现为每个彩色像素添加正确深度值的目标

我尝试过使用ReprojectMageto3D(),但我无法计算出Q矩阵。
我还尝试从该页面分配其他功能,但似乎无法正确输入。

据我所知,您缺少摄影机坐标帧之间的转换。Kinect(v1和v2)使用两个单独的相机系统来捕获深度和RGB数据,因此它们之间存在平移和旋转。您可能可以假设没有旋转,但您必须考虑平移以修复所看到的未对准


试着从开始。

据我所知,Matlab对Kinect(尤其是v1)有很好的支持。您可以使用名为
alignColorToDepth
的函数,如下所示:

[alignedFlippedImage,flippedDepthImage]=alignColorToDepth(深度图像,颜色图像,深度设备)

返回的值是
alignedFlippedImage
(RGB注册图像)和
flippedDepthImage
(注册深度图像)。这两个图像已对齐,可供您处理

您可以在上找到更多信息


希望这是您需要的:)

是的,我知道缺少翻译,这就是我问这个问题的原因。链接的踏板建议使用kinect api。这是我不愿做的事情,因为据我所知,它无法处理whit Mat文件。另外,由于我的输入是Mat文件,因此我无法使用该踏板的示例代码。您使用的是Kinect v2吗?如果是这样,您可能可以在OpenCV中使用该函数,因为棋盘会显示在RGB和IR中。如果您使用的是Kinect v1,那么您可能需要设置一个可以在两个帧中精确定位的目标来计算变换。或者,您可以手动调整偏移量,直到它看起来令人满意。我使用的是Kinect V1。此外,手动调整偏移不是一个选项。原因是偏移取决于高度。由于我有深度图像,我希望有一种方法可以根据深度值计算变换,该值将其映射到rgb图像中的正确像素。在kinect v1 IR帧中也可以看到棋盘格,但它会被投影图案扭曲。这可以通过在拍摄图像时覆盖红外投影仪来解决。但是,我已经编辑了我的问题,包括它必须在C++代码中完成。如果你正在编写自己的Simulink块,你可以尝试使用MATLAB函数块在Matlab中进行。