相关疑难解决方法(0)

OpenCV triangulatePoints用手

我有两个严格并排连接的摄像机,朝向平行方向.

摄像头的 投影矩阵左摄像头的投影矩阵

适用于相机的投影矩阵适用于右相机的投影矩阵

当我triangulatePoints对相应点的两个向量执行时,我得到了3D空间中的点集合.3D空间中的所有点都具有负Z坐标.

所以,要深究这个......

我的假设是OpenCV使用右手坐标系.

用户提醒: 用手提醒

我假设每个摄像机的初始方向指向正Z轴方向.

因此,通过使用像我在开头提出的那些投影矩阵,我会假设摄像机位于空间中,如下所示:

我怎么想象相机在太空中定位和定向

这个假设与我观察到的负数Z corrdinates的交错点时的观察结果相冲突.我能想到的唯一解释是OpenCV实际上使用左手坐标系.因此,对于我在开头所述的投影矩阵,这就是摄像机在太空中的定位方式:

左手坐标系中的摄像头

这表明我的左侧相机在这种情况下不在左侧.这就是为什么我得分为负的深度.

而且,如果我尝试triangulatePointssolvePnP我结合遇到问题.

我使用输出triangulatePoints作为输入solvePnP.我希望相机坐标靠近3D坐标系的原点.我希望计算出的相机位置与开头使用的投影矩阵相匹配.但这不会发生.我得到了一些完全狂野的结果,错过了预期值超过基线长度的10倍.

此示例比上述内容更完整地表示问题.

points3D 在此输入图像描述

以下是生成这些点的代码.

移动,设置相机A和相机D ...

Mat cameraMatrix = (Mat_<double>(3, 3) <<
    716.731, 0, 660.749,
    0, 716.731, 360.754,
    0, 0, 1);
Mat distCoeffs = (Mat_<double>(5, 1) << 0, 0, 0, 0, 0);



Mat rotation_a = Mat::eye(3, 3, CV_64F); // no rotation
Mat …
Run Code Online (Sandbox Code Playgroud)

c++ opencv triangulation

24
推荐指数
1
解决办法
3135
查看次数

Python Opencv SolvePnP产生错误的翻译向量

我正在尝试使用单应性校准并在Blender 3d中找到单个虚拟相机的位置和旋转.我正在使用Blender,以便在我进入真实世界之前我可以仔细检查我的结果.我在固定相机的视野中渲染了十张不同位置的棋盘图片和旋转.使用opencv的python,我使用cv2.calibrateCamera从十个图像中检测到的棋盘角上找到内在矩阵,然后在cv2.solvePnP中使用它来查找外部参数(平移和旋转).然而,尽管估计的参数接近实际参数,但仍然存在一些可疑的参数.我对翻译的初步估计是(-0.11205481,-0.0490256,8.13892491).实际位置是(0,0,8.07105).非常接近吧?但是,当我移动并稍微旋转相机并重新渲染图像时,估计的平移变得更远了.估计:( - 0.15933154,0.13367286,9.34058867).实际:( - 1.7918,-1.51073,9.76597).Z值接近,但X和Y不接近.我完全糊涂了.如果有人能帮助我解决这个问题,我将非常感激.这是代码(它基于随opencv提供的python2校准示例):

#imports left out
USAGE = '''
USAGE: calib.py [--save <filename>] [--debug <output path>] [--square_size] [<image mask>]
'''   

args, img_mask = getopt.getopt(sys.argv[1:], '', ['save=', 'debug=', 'square_size='])
args = dict(args)
try: img_mask = img_mask[0]
except: img_mask = '../cpp/0*.png'
img_names = glob(img_mask)
debug_dir = args.get('--debug')
square_size = float(args.get('--square_size', 1.0))

pattern_size = (5, 8)
pattern_points = np.zeros( (np.prod(pattern_size), 3), np.float32 )
pattern_points[:,:2] = np.indices(pattern_size).T.reshape(-1, 2)
pattern_points *= square_size

obj_points = []
img_points = []
h, w = 0, …
Run Code Online (Sandbox Code Playgroud)

python opencv camera-calibration

17
推荐指数
1
解决办法
1万
查看次数

标签 统计

opencv ×2

c++ ×1

camera-calibration ×1

python ×1

triangulation ×1