我创建了一个在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;
}
从我的程序输出中可以看出,当我将唯一白色蒙版应用于深度图像时,四直升机体不包含1种颜色。原因是两张图像之间存在未匹配。
我知道我需要相机的校准参数,我从最后一个使用此设置的人那里得到了这些参数。是否在Matlab中进行了校准,结果如下:
我花了大量时间阅读以下关于摄像机校准和3D重建的opencv页面(由于堆栈交换lvl不能包含链接)
但我不能为我的生活弄清楚如何实现我为每个彩色像素添加正确深度值的目标。
我尝试使用reprojectImageTo3D(),但我无法弄清楚Q矩阵。 我也尝试了该页面的其他功能,但我似乎无法正确输入。
答案 0 :(得分:1)
据我所知,Matlab对Kinect有很好的支持(特别是对于v1)。您可以使用名为alignColorToDepth
的函数,如下所示:
[alignedFlippedImage,flippedDepthImage] = alignColorToDepth(depthImage,colorImage,depthDevice)
返回的值为alignedFlippedImage
(RGB注册图像)和flippedDepthImage
(注册深度图像)。这两个图像已对齐,可供您处理。
您可以在this MathWorks documentation page找到更多信息。
希望它能满足您的需求:)
答案 1 :(得分:0)
据我所知,你错过了相机坐标系之间的转换。 Kinect(v1和v2)使用两个独立的摄像系统来捕获深度和RGB数据,因此它们之间存在平移和旋转。您可能无法轮换,但您必须考虑翻译以解决您所看到的错位。
尝试从this thread开始。