相关疑难解决方法(0)

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 Python计算相机世界位置

我想计算我的相机在世界坐标中的位置.这应该相当容易,但我没有得到我期望的结果.我相信我已经阅读了有关此主题的所有内容,但我的代码无效.这是我做的:

我有一个相机看着一个区域.

1)我画了一张该地区的地图.

2)我通过使用在我的地图上将4个图像点匹配到4个点来计算单应性 cv2.getPerspectiveTransform

3)H homography将每个世界坐标转换为摄像机坐标; 这是正常的

4)为了计算相机矩阵我遵循这个:

translation = np.zeros((3,1)) 
translation[:,0] = homography[:,2]

rotation = np.zeros((3,3))
rotation[:,0] = homography[:,0]
rotation[:,1] = homography[:,1]
rotation[:,2] = np.cross(homography[0:3,0],homography[0:3,1])

cameraMatrix = np.zeros((3,4))
cameraMatrix[:,0:3] = rotation
cameraMatrix[:,3] = homography[:,2]

cameraMatrix = cameraMatrix/cameraMatrix[2][3] #normalize the matrix
Run Code Online (Sandbox Code Playgroud)

5)根据这个,相机的位置应该这样计算:

x,y,z = np.dot(-np.transpose(rotation),translation)
Run Code Online (Sandbox Code Playgroud)

我得到的坐标是完全错误的.我想这个问题应该在步骤4或5的某个地方.我的方法有什么问题?

python opencv computer-vision homography augmented-reality

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

如何使用3d-to-2d-points估计相机姿势(使用opencv)

您好我的目标是开发用于飞机(模拟器)驾驶舱的头部跟踪功能,以便提供AR以支持民用飞行员在恶劣的视觉条件下着陆和飞行.

我的方法是检测我知道3D坐标的特征点(在暗模拟器LED中),然后计算估计的(头戴式摄像机)姿势[R | t](旋转与翻译同步).

我所遇到的问题是估计的姿势似乎总是错误的,我的3D点(我也用来估计姿势)的投影不与2D图像点重叠(或不可见).

LED检测工作但不是姿势估计和3D投影

我的问题是:

如何使用给定的2D到3D点对应关系估计相机姿态.

为什么我的尝试不起作用,哪里可能是错误的来源?

为了使理论解决方案在现实环境中工作,测量(3D和2D点和相机矩阵)的准确度必须如何准确?

这种方法在理论上是否适用于共面点(x,y轴改变)?

我使用的硬件是Epson BT-200.

在飞机上我定义了一个固定的纵坐标,我希望我的程序可以实现相对平移和旋转.程序检测(唯一)LED的图像坐标,并将它们与相应的3D坐标相匹配.使用相机矩阵我使用open-cv示例android代码(https://github.com/Itseez/opencv/tree/master/samples/android/camera-calibration)我尝试使用solvePnP估计姿势.

我的相机矩阵和失真略有变化.以下是我从程序中收到的一些值.我确保打印出的圆形图案的圆距与源代码中记录的相同(以米为单位).

以下是一些示例以及如何创建它的OpenCV Mat.

//  protected final double[] DISTORTION_MATRIX_VALUES = new double[]{
//          /*This matrix should have 5 values*/
//          0.04569467373955304,
//          0.1402980385369059,
//          0,
//          0,
//          -0.2982135315849994
//  };

//  protected final double[] DISTORTION_MATRIX_VALUES = new double[]{
//          /*This matrix should have 5 values*/
//          0.08245931646421553,
//          -0.9893762277047577,
//          0,
//          0,
//          3.23553287438898
//  };

//  protected …
Run Code Online (Sandbox Code Playgroud)

java opencv computer-vision camera-calibration pose-estimation

8
推荐指数
1
解决办法
3787
查看次数

来自solvePnP的相机姿势

目标:

我需要检索相机的位置和姿态角度(使用OpenCV/Python).

定义:

姿态角定义如下:

偏航是水平面上相机的大致方向:朝北= 0,朝东= 90°,南= 180°,西= 270°等.

俯仰是摄像机的"鼻子"方向:0°=水平地看地平线上的点,-90°=垂直向下看,+ 90°=垂直向上看,45°=向上看45°角从地平线等

如果相机在您手中向左或向右倾斜时会滚动(因此,当此角度变化时,它总是在地平线上观察点):+ 45°=当您抓住相机时,顺时针旋转倾斜45°,因此+ 90°(和-90°)将是肖像图片所需的角度,例如等.

世界参考框架:

我的世界参考框架是这样的:

向东= + X
向北= + Y
向天空= + Z.

我的世界对象点在该参考系中给出.

相机参考框架:

根据文档,相机参考框架的方向如下: 相机参考框架

要做的事:

现在,从cv2.solvepnp()一堆图像点和它们相应的世界坐标,我已经计算了两个rvectvec.但是,根据以下文档:http://docs.opencv.org/trunk/d9/d0c/group__calib3d.html#ga549c2075fac14829ff4a58bc931c033d,它们是:

rvec ; 输出旋转矢量(请参阅Rodrigues())tvec,它将点从模型坐标系带到摄像机坐标系.
tvec ; 输出翻译矢量.

这些载体被给予去相机参考帧.
我需要进行精确的逆操作,从而检索相对于世界坐标的摄像机位置和姿态.

相机位置:

所以,我已经计算从旋转矩阵rvecRodrigues():

rmat = cv2.Rodrigues(rvec)[0]
Run Code Online (Sandbox Code Playgroud)

如果我就在这里,在世界坐标系中表示的摄像机位置由下式给出:

camera_position = -np.matrix(rmat).T * np.matrix(tvec)    
Run Code Online (Sandbox Code Playgroud)

(src:来自cv :: solvePnP的世界坐标中的相机位置)
这看起来相当不错.


相机姿态(偏航,俯仰和滚动): …

python opencv-solvepnp

6
推荐指数
1
解决办法
1780
查看次数

增强现实OpenGL + OpenCV

我是OpenCV的新手,对OpenGL的经验有限.我愿意将3D对象覆盖在棋盘的校准图像上.任何提示或指导?

opengl opencv layer augmented-reality camera-calibration

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