就像问题所说的那样,我正在寻找一个完整的、最小的、运动结构(又名 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) 我正在尝试使用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.