相关疑难解决方法(0)

3D基本矩阵的对应关系

在MATLAB中,我使用归一化的八点算法计算了基本矩阵(两个图像).由此我需要对3D空间中的相应图像点进行三角测量.根据我的理解,要做到这一点,我需要旋转和翻译图像的相机.最简单的方法当然是首先校准相机然后拍摄图像,但这对我的应用来说太紧张了,因为它需要这个额外的步骤.

这样我就可以进行自动(自拍)相机校准.我看到了捆绑调整的提及,但是在"邀请3D视觉"中它似乎需要初始平移和旋转,这让我觉得需要校准相机或者我的理解不足.

所以我的问题是如何自动提取旋转/平移,以便我可以将图像点重新投影/三角测量到3D空间.任何MATLAB代码或伪代码都会很棒.

math matlab linear-algebra computer-vision matlab-cvst

12
推荐指数
2
解决办法
9876
查看次数

是否有运动/3D 重建结构的最小、完整、有效的示例?

就像问题所说的那样,我正在寻找一个完整的、最小的、运动结构(又名 3D 重建)管道的工作示例。

我马上说我没有相机参数。我不知道焦距或相机内部结构。因此,90% 的示例/教程都是 无效 的。

关于这个主题有很多问题,但代码只是片段,而不是完整的 SfM 过程。许多指令是矛盾的,或者只是猜测,并且开源外部库很难遵循。

所以我正在寻找一个简短的、完整的、最小的、可行的示例。最重要的是工作要求,因为太多的代码会产生不好的结果。

我已经用下面的代码对其进行了尝试。我使用匹配对的合成数据,因此没有噪音或不良对应问题需要解决。目标是从 2 个视图重建一个立方体(8 个 3d 点),每个视图有 8 个 2d 点。然而,最终的结果却很糟糕。没有立方体形状的外观。(我尝试过标准化和集中数据,这不是问题)。

任何能够提供更好的最小工作示例,或者指出我的尝试有什么问题的人,我们将不胜感激。

import cv2
import numpy as np
import scipy.linalg


def combineTR(T,R):  #turn a translation vector and a rotation matrix into one 3x4 projection matrix
    T4 = np.eye(4)
    T4[:3, 3] = T  # make it 4x4 so we can dot product it
    R4 = …
Run Code Online (Sandbox Code Playgroud)

python opencv 3d-reconstruction fundamental-matrix

10
推荐指数
0
解决办法
1290
查看次数

通过基本矩阵校正未校准的摄像机

我正在尝试使用Emgu/OpenCV校准Kinect摄像头和外部摄像头.我被困住了,我真的很感激任何帮助.

我选择通过基本矩阵,即极线几何来做到这一点.但结果并不像我预期的那样.结果图像是黑色的,或根本没有任何意义.Mapx和mapy点通常都等于无限或 - 无限,或者全部等于0.00,并且很少有常规值.

这就是我试图纠正的方法:

1.)查找图像点 从图像集中获得两个图像点阵列(每个摄像机一个).我用棋盘和FindChessboardCorners函数完成了这个.

2.) 找到基本矩阵

 CvInvoke.cvFindFundamentalMat(points1Matrix, points2Matrix, 
_fundamentalMatrix.Ptr, CV_FM.CV_FM_RANSAC,1.0, 0.99, IntPtr.Zero);
Run Code Online (Sandbox Code Playgroud)

我是否从整个图像集中传递所有收集的点,或者只是从两个图像中尝试纠正?

3.)查找单应矩阵

 CvInvoke.cvStereoRectifyUncalibrated(points11Matrix, points21Matrix, 
_fundamentalMatrix.Ptr, Size, h1.Ptr, h2.Ptr, threshold);
Run Code Online (Sandbox Code Playgroud)

4.)获取mapx和mapy

double scale = 0.02;
CvInvoke.cvInvert(_M1.Ptr, _iM.Ptr, SOLVE_METHOD.CV_LU);

CvInvoke.cvMul(_H1.Ptr, _M1.Ptr, _R1.Ptr,scale);
CvInvoke.cvMul(_iM.Ptr, _R1.Ptr, _R1.Ptr, scale);
CvInvoke.cvInvert(_M2.Ptr, _iM.Ptr, SOLVE_METHOD.CV_LU);
CvInvoke.cvMul(_H2.Ptr, _M2.Ptr, _R2.Ptr, scale);
CvInvoke.cvMul(_iM.Ptr, _R2.Ptr, _R2.Ptr, scale);

CvInvoke.cvInitUndistortRectifyMap(_M1.Ptr,_D1.Ptr, _R1.Ptr, _M1.Ptr, 
mapxLeft.Ptr, mapyLeft.Ptr) ;
Run Code Online (Sandbox Code Playgroud)

我这里有问题...因为我没有使用校准图像,我的相机矩阵和失真系数是多少?如何从基本矩阵或单应矩阵中获取它?

5.)重新映射

CvInvoke.cvRemap(src.Ptr, destRight.Ptr, mapxRight, mapyRight, 
(int)INTER.CV_INTER_LINEAR, new MCvScalar(255));
Run Code Online (Sandbox Code Playgroud)

这并没有带来好结果.如果有人能告诉我我做错了什么,我将不胜感激.

我有25对图像,棋盘图案大小为9x6.

opencv image-processing emgucv camera-calibration

5
推荐指数
1
解决办法
1672
查看次数