gpt4 book ai didi

OpenCV 立体声匹配/校准

转载 作者:太空宇宙 更新时间:2023-11-03 20:42:32 25 4
gpt4 key购买 nike

我最初在 OpenCV 论坛上发布了这个,但不幸的是,我没有得到太多的意见/回复,所以我在这里发布是希望有人可能有方向建议?

我正在使用 Bumblebee XB3 立体相机,它有 3 个镜头。我花了大约三周时间阅读有关使用立体校准和立体匹配功能的论坛、教程、Learning OpenCV 书籍和实际的 OpenCV 文档。总而言之,我的问题是我生成了一个很好的视差图,但点云很差,看起来歪斜/压扁,不能代表实际场景。

到目前为止我做了什么:

使用 OpenCV 立体校准和立体匹配示例来:

使用棋盘图像校准我的立体相机

1) 原始场景图像:http://answers.opencv.org/upfiles/1380850337241986.jpg
2)使用相机校准后的矩阵校正从相机获得的原始图像:http://answers.opencv.org/upfiles/13808502665723237.png
3)使用立体匹配(SGBM)从校正后的图像生成视差图像:
4) 将这些差异投影到 3D 点云

到目前为止,我为消除我的问题所做的工作:

  • 我试过第 1 和第 2 个图像,然后是第 2 和第 3 个镜头,然后
    最后是第一和第二。
  • 我通过改变我的棋盘捕获重新运行校准
    距离(更近/更远)
  • 我使用了超过 20 对立体声对进行校准
  • 使用不同的棋盘尺寸:我使用了 9x6 棋盘图像
    校准,现在改用 8x5 代替
  • 我试过使用块匹配以及 SGBM 变体并得到
    比较相似的结果。得到
    到目前为止,SGBM 效果更好。
  • 我改变了视差范围,改变了 SAD 窗口大小等
    小改进

  • 我怀疑问题是:

    我的视差图像看起来相对可以接受,但下一步是使用 Q 矩阵转到 3D 点云。我怀疑,我没有正确校准相机以生成正确的 Q 矩阵。不幸的是,我在思考我还能做些什么来获得更好的 Q 矩阵方面遇到了困难。有人可以提出建议吗?

    我认为可能有问题的另一件事是我在使用 cv::stereoCalibrate 函数时所做的假设。目前,我单独校准每个相机以获得相机和失真(cameraMatrix[0]、distCoeffs[0] 和 cameraMatrix[1]、distCoeffs[1])矩阵,因此它使立体校准函数的复杂性更容易一些。
    stereoCalibrate(objectPoints, imagePoints[0], imagePoints[1],
    cameraMatrix[0], distCoeffs[0],
    cameraMatrix[1], distCoeffs[1],
    imageSize, R, T, E, F,
    TermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 100, 1e-5),
    //CV_CALIB_FIX_ASPECT_RATIO +
    //CV_CALIB_ZERO_TANGENT_DIST +
    //CV_CALIB_SAME_FOCAL_LENGTH +
    CV_CALIB_RATIONAL_MODEL
    //CV_CALIB_FIX_K3 + CV_CALIB_FIX_K4 + CV_CALIB_FIX_K5
    );

    此外,我认为提及我如何从视差到点云可能很有用。我正在使用 OpenCV 的 cv::reprojectImageTo3D,然后将数据写入 PCL 点云结构。这是相关的代码:
    cv::reprojectImageTo3D( imgDisparity16S, reconstructed3D, Q, false, CV_32F);
    for (int i = 0; i < reconstructed3D.rows; i++)
    {
    for (int j = 0; j < reconstructed3D.cols; j++)
    {
    cv::Point3f cvPoint = reconstructed3D.at<cv::Point3f>(i, j);
    //Filling in a PCL structure
    pcl::PointXYZRGB point;
    point.x = cvPoint.x;
    point.y = cvPoint.y;
    point.z = cvPoint.z;
    point.rgb = rectified_imgRight.at<cv::Vec3b>(i,j)[0]; //Grey information

    point_cloud_ptr->points.push_back (point);
    }
    }

    point_cloud_ptr->width = (int) point_cloud_ptr->points.size();
    point_cloud_ptr->height = 1;
    pcl::io::savePCDFileASCII("OpenCV-PointCloud.pts", *point_cloud_ptr);

    PS:之所以选择上传这些图片,是因为场景有些质感,所以期待回复说场景太同质了。隔板的盖子和椅子的质感也相当丰富。

    几个问题:

    你能帮我删除似乎是点云一部分的图像/视差平面吗?为什么会这样?

    有什么明显的我做错了吗?我会发布我的代码,但它与提供的 OpenCV 示例非常相似,我认为我没有做任何更有创意的事情。如果有可能涉及的特定部分,我可以。

    在我天真的看来,视差图像似乎还可以。但是点云绝对不是我从相对不错的视差图像中所期望的,它更糟糕。

    如果有帮助,我已经提到了我在相机校准后获得的 Q 矩阵,以防出现明显的跳跃。将此与 Learning OpenCV 一书进行比较,我认为没有任何明显不正确的地方......
    Q: rows: 4
    cols: 4
    data: [ 1., 0., 0., -5.9767076110839844e+002, 0., 1., 0.,
    -5.0785438156127930e+002, 0., 0., 0., 6.8683948509213735e+002, 0.,
    0., -4.4965180874519222e+000, 0. ]

    感谢您的阅读,我会诚实地感谢此时的任何建议......

    最佳答案

    我在使用 OpenCV (v.2.4.6) 3D 重建功能时发现了类似的问题。
    有些人,比如 Martin Peris,自己又实现了。
    http://blog.martinperis.com/2012/01/3d-reconstruction-with-opencv-and-point.html

    可悲的是,有时我在我的数据的两种实现中都发现了问题。
    所以,我认为我在这些情况下的问题是由于外部相机参数描述不佳。也许,这也是你的情况。 :-?

    附注。为了摆脱背景,您需要对其进行分割。或者,至少,一旦重建工作,检查大于阈值的深度值。 handleMissingValues 标志仅消除“无穷大”处的点
    PS2。请告诉我们您是否解决了这个问题。我认为它对所有社区都很有值(value)。谢谢

    关于OpenCV 立体声匹配/校准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19205557/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com