Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用opencv束调整_Opencv_Camera_Mathematical Optimization_Camera Calibration - Fatal编程技术网

如何使用opencv束调整

如何使用opencv束调整,opencv,camera,mathematical-optimization,camera-calibration,Opencv,Camera,Mathematical Optimization,Camera Calibration,我已经计算了5个摄影机矩阵(c1,…c5),摄影机矩阵是通过将3D对象放置在5个不同的位置来计算的,对于每个位置,我已经计算了摄影机矩阵(摄影机是常量)。采用奇异值分解方法计算摄像机矩阵 现在我想在opencv中使用束调整来获得一个最佳的相机矩阵。 我找到了文件 但是文档不清楚,而且我也找不到任何示例代码。 有人能解释一下我如何使用opencv束调整来获得最佳的摄像机矩阵吗?参见第155页的示例代码。大概是这样的: vector<CameraParams> cameras; vect

我已经计算了5个摄影机矩阵(
c1,…c5
),摄影机矩阵是通过将3D对象放置在5个不同的位置来计算的,对于每个位置,我已经计算了摄影机矩阵(摄影机是常量)。采用奇异值分解方法计算摄像机矩阵

现在我想在
opencv
中使用束调整来获得一个最佳的相机矩阵。 我找到了文件

但是文档不清楚,而且我也找不到任何示例代码。
有人能解释一下我如何使用opencv束调整来获得最佳的摄像机矩阵吗?

参见第155页的示例代码。大概是这样的:

vector<CameraParams> cameras;
vector<MatchesInfo> pairwise_matches;
vector<ImageFeatures> features(num_images);

// initialize the above params here

Ptr<BundleAdjusterBase> adjuster;
adjuster = makePtr<BundleAdjusterReproj>();
if (!(*adjuster)(features, pairwise_matches, cameras)) {
    cout << "Camera parameters adjusting failed." << endl; 
    return -1;
}
矢量相机;
向量成对匹配;
矢量特征(num_图像);
//在此处初始化上述参数
Ptr调节器;
调节器=makePtr();
if(!(*调节器)(功能、成对匹配、摄像头)){

cout我的回答假设您使用一个特定的3D对象,其尺寸是精确已知的,从该对象的多个图像估计一个相机的内在参数。鉴于您对@fireant的回答的评论,我认为这适用于您的问题

关于“摄像机矩阵”含义的简要说明 术语“摄像机矩阵”非常模糊,可以用多种方式理解:

  • 摄影机姿势T=[R | T],也表示外部摄影机参数
  • 固有相机矩阵K=[fx,s,cx;0,fy,cy;0,0,1]
  • 摄像机投影矩阵P=K[R | t]
正如你所说,你有多个图像,但你想要一个单一的摄像机矩阵,我想你说的是内在的摄像机矩阵K

为什么不应该使用束调整 束调整是一种用于解决比摄像机校准更普遍问题的技术,其中外部摄像机参数(即3D方向和位置)和3D地标(例如3D点)未知。正如@fireant所指出的,也可以在该全局联合优化中包括内在相机参数。另一方面,相机校准假设3D地标已知,并由一台相机在多张图像中观察到,因此它优化了一组内在相机参数和一个相机姿势法师

需要理解的是,更一般的优化问题涉及更多要优化的变量,因此很难对它们进行良好约束。如果约束不好,它们将以一种确实减少全局误差的方式优化变量,但这与实际问题的解不符。这就是为什么在使用联合优化算法时,应始终尝试减少要优化的变量数量

在束调整与相机校准的情况下,只有当您对三维地标的位置没有准确的概念时,才应使用束调整。即使如此,尝试将问题解耦可能是一个更好的主意,例如通过事先校准三维对象。如果您确实对位置有准确的概念对3D地标进行校准,则不应将其视为要优化的变量,因此应使用相机校准技术

优化的初始估计 您的意思是,您对摄影机矩阵K有多个不准确的估计,并且希望执行联合优化以获得单个更准确的估计。问题是,由于您希望估计单个摄影机矩阵,因此需要为联合优化算法提供仅一个初始估计值

为了仍然使用多个近似估计值,您可以尝试选择最接近真实解的一个作为优化算法的初始估计值。为此,您可以使用多个启发式标准。例如,您可以选择与最小重投影误差相关的一个,或者您可以使用t与校准对象最大的图像相关的图像,等等

然而,它可能不会对摄像机矩阵的最终估计产生很大的影响

如何使用“CalibleCamera”完成此任务 假设您有一个带有特征点的校准对象。它可以是标准的二维棋盘或非等距圆网格,或任何校准的三维对象。并且假设您已经开发了一种在图像中检测此校准对象的方法(例如,自定义特征检测器,或手动确定对象位置的工具)。然后,您可以定义一个向量
allObjectPoints
,其中包含对象上可以检测到的3D点。然后,对于每个图像
i
,您可以确定检测到的2D点的向量
imagePoints\u i
,该2D点是对象的一些3D点的观测值(请注意,一些对象点可能被遮挡,因此可能比
allObjectPoints
中的项目少)。然后,由于所有对象点都是可识别的(直接或通过推理),您可以确定向量
objectPoints\u i
,该向量包含在图像
i
中实际观察到的对象3D点,并与
imagePoints\u i
一致排列


然后将所有
objectPoints\u i
向量堆叠在一个大向量
objectPoints
中。类似地,将所有
imagePoints\u i
向量堆叠在一个大向量
imagePoints
中。然后可以调用
caliberecamera
,并使用
CV\u CALIB\u-USE\u-GUESS
表示您希望优化算法使用您提供的初始值。

您的问题没有多大意义,因为束调整技术通常用于联合估计姿势(即T=[R | T]描述方向和位置)多个摄像机的帧和一些观测点的3D位置。估计摄像机矩阵(即。