【问题标题】:Merging rgb and depth images from a kinect合并来自 kinect 的 RGB 和深度图像
【发布时间】:2016-01-15 00:51:06
【问题描述】:

我正在创建一个在 Simulink S-Function(它是 c++ 代码)中实现的视觉算法。除了颜色和深度图像的对齐之外,我完成了所有想要的事情。

我的问题是如何使 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:

从我的程序输出中可以看出,当我将 onlywhite 蒙版应用于深度图像时,四旋翼机身不包含 1 种颜色。原因是 2 张图片之间存在未匹配。

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

Matlab calibration esults:

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

但我终其一生都无法弄清楚如何实现为每个彩色像素添加正确深度值的目标。

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

【问题讨论】:

  • 如果您正在编写自己的 Simulink 模块,您可以尝试在 MATLAB 中使用 MATLAB Function Block。

标签: c++ matlab opencv computer-vision matlab-cvst


【解决方案1】:

据我所知,Matlab 对 Kinect 的支持非常好(尤其是 v1)。你可以使用一个名为alignColorToDepth的函数,如下:

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

返回值为alignedFlippedImage(RGB 配准图像)和flippedDepthImage(配准深度图像)。这两张图片已对齐,可供您处理。

您可以在this MathWorks documentation page 找到更多信息。

希望这是你需要的:)

【讨论】:

  • 对不起,我已经编辑了我的问题,包括它必须在 c++ 代码中完成。
【解决方案2】:

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

尝试以this thread 开头。

【讨论】:

  • 是的,我知道缺少翻译这就是我问这个问题的原因。您链接的胎面建议使用 kinect api。这是我宁愿不做的事情,因为据我所知,它无法使用 Mat 文件。此外,由于我的输入是 Mat 文件,我将无法使用该踏板中的示例代码。
  • 您使用的是 Kinect v2 吗?如果是这样,您可能可以在 OpenCV 中使用 stereoCalibrate 函数,因为棋盘会显示在 RGB 和 IR 中。如果您使用的是 Kinect v1,那么您可能需要设置一个可以在两个帧中精确定位的目标来计算转换。或者,您可以手动调整偏移量,直到看起来满意为止。
  • 我使用的是 Kinect V1。也不能手动调整偏移量。原因是偏移量取决于高度。由于我有深度图像,我希望有一种方法可以计算依赖于深度值的变换,将其映射到 rgb 图像中的正确像素。
  • 在 kinect v1 IR 框架中也可以看到棋盘格,但它会被投影图案扭曲。这可以通过在捕获图像时覆盖红外投影仪来解决。不过,它需要非常好的环境照明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 2016-06-16
  • 2013-11-24
  • 1970-01-01
相关资源
最近更新 更多