gpt4 book ai didi

android - 来自两个未失真图像的点云

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

我想使用 OpenCV 从 Motion 做一些结构。这应该发生在 Android 上。目前我有 cameraMatrix(内部参数)和相机校准的失真系数。

用户现在应该从建筑中拍摄 2 张​​图像,应用程序应该生成点云。注意:用户可能还会在沿着建筑物的一侧移动时稍微旋转智能手机的相机......

目前,我有以下信息:

  • 未失真的左图
  • 未失真的右图
  • 使用 SIFT 的良好匹配列表
  • 单应矩阵
  • 基本矩阵

我已经在互联网上搜索过,现在我很困惑我应该如何继续......有人说我需要使用 stereoRectify 来获取 Q,并使用 Q 和 reprojectImageTo3D() 来获取点云。

其他人说我需要使用 stereoRectifyUncalibrated 并使用此方法中的 H1 和 H2 来填充 triangulatePoints 的所有参数。在 triangulatePoints 中,我需要每个相机/图像的 projectionMatrix,但根据我的理解,这似乎绝对是错误的。

所以对我来说有一些问题:

  • 如何从我已有的所有信息中获得 R 和 T(旋转和平移)
  • 如果我使用 stereoRectify,前 4 个参数是 cameraMatrix1、distortionCoeff1、cameraMatrix2、distortionCoeff2) - 如果我没有像 Kinect 这样的 stereoCamera,ameraMatrix1 和 cameraMatrix2 是否适合我的设置(智能手机上的单摄像头)<
  • 如何获得 Q(猜猜如果我有 R 和 T 我可以从 stereoRectify 获得)
  • 是否有另一种方法获取每个相机的投影矩阵,以便我可以使用 OpenCV 提供的三角测量方法

我知道有很多问题,但谷歌搜索让我很困惑,所以我需要弄清楚这个问题。我希望有人能帮助我解决我的问题。

谢谢

PS 因为这是更多的理论问题,所以我没有发布一些代码。如果您想要/需要查看代码或我的相机校准值,只需询问,我会将它们添加到我的帖子中。

最佳答案

我之前写过一些关于将 Farneback 的光流用于 Structure from Motion 的文章。您可以在此处阅读详细信息。

但这里是代码 fragment ,它有点工作,但不是很好的实现。希望大家可以作为引用。

/* Try to find essential matrix from the points */
Mat fundamental = findFundamentalMat( left_points, right_points, FM_RANSAC, 0.2, 0.99 );
Mat essential = cam_matrix.t() * fundamental * cam_matrix;

/* Find the projection matrix between those two images */
SVD svd( essential );
static const Mat W = (Mat_<double>(3, 3) <<
0, -1, 0,
1, 0, 0,
0, 0, 1);

static const Mat W_inv = W.inv();

Mat_<double> R1 = svd.u * W * svd.vt;
Mat_<double> T1 = svd.u.col( 2 );

Mat_<double> R2 = svd.u * W_inv * svd.vt;
Mat_<double> T2 = -svd.u.col( 2 );

static const Mat P1 = Mat::eye(3, 4, CV_64FC1 );
Mat P2 =( Mat_<double>(3, 4) <<
R1(0, 0), R1(0, 1), R1(0, 2), T1(0),
R1(1, 0), R1(1, 1), R1(1, 2), T1(1),
R1(2, 0), R1(2, 1), R1(2, 2), T1(2));

/* Triangulate the points to find the 3D homogenous points in the world space
Note that each column of the 'out' matrix corresponds to the 3d homogenous point
*/
Mat out;
triangulatePoints( P1, P2, left_points, right_points, out );

/* Since it's homogenous (x, y, z, w) coord, divide by w to get (x, y, z, 1) */
vector<Mat> splitted = {
out.row(0) / out.row(3),
out.row(1) / out.row(3),
out.row(2) / out.row(3)
};

merge( splitted, out );

return out;

关于android - 来自两个未失真图像的点云,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22667121/

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