C ++ / OpenCV - 深度图问题:Point Cloud中的项目有一些失真

问题描述 投票:2回答:1

我想创建一个深度贴图以获得每个像素的3D位置,这样我就可以在我的图片上显示某些所选项目的3D位置。为了查看我的深度数据是否正确,我使用MeshLab对其进行可视化。

我使用KITTI数据集的立体数据,以便对图像进行校正,并提供每个摄像机的校准。

该过程如下:

图像左+右图 - >使用立体半全局匹配(SGBM)计算视差 - >使用cv :: reprojectImageTo3D()计算深度图,并通过校准参数初始化Q并感谢此功能:

 cv::stereoRectify(cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, imgSize, R, T, R1, R2, P1, P2, Q);

我的问题如下:

道路很好,但招牌有一些扭曲。我不明白,我试图改变参数,但没有成功。我总是有这种扭曲。这很烦人,因为我无法计算出标志牌的良好3D位置。我也尝试过经典的块匹配,但它是相同的,与半全局的匹配结果并不是那么好。

然而,我的差异看起来像这样(这对我来说似乎很好):

视差计算的参数如下:

    StereoSGBM sgbm;
    sgbm.SADWindowSize = 3;
    sgbm.numberOfDisparities = 128;
    sgbm.preFilterCap = 10;
    sgbm.minDisparity = 0;
    sgbm.uniquenessRatio = 10.0;
    sgbm.speckleWindowSize = 100;
    sgbm.speckleRange = 32;
    sgbm.disp12MaxDiff = 1;
    sgbm.fullDP = 1;
    sgbm.P1 = sgbm.SADWindowSize*sgbm.SADWindowSize*4;
    sgbm.P2 = sgbm.SADWindowSize*sgbm.SADWindowSize*32;

    sgbm(gray1, gray2, disp);

你知道为什么会这样吗?我怎么解决这个问题?我希望标牌有一个平坦的表面。

c++ opencv depth disparity-mapping
1个回答
0
投票

您可以通过使用SGBM参数稍微改善一下,但实际情况是立体声数据很嘈杂,您不应期望在点云中获得完美的平面符号。

如果您有兴趣找到符号的3D位置,则从RGB图像中分割符号并将点云中的对应点平均在一起应产生合理的结果。

© www.soinside.com 2019 - 2024. All rights reserved.