SciPy非线性最小平方单位

2024-04-29 06:56:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试用python进行捆绑调整。所以我测试非线性最小二乘模。 然后我写了如下代码。我想得到正确的Pmat代表三个摄像机的摄像机投影矩阵。但是我有一个错误,“ValueError:object too deep for desired array”。在

有谁能提供解决这个问题的线索吗?在

谨致问候, 柳金浩。在

from math import* from numpy import *

import pylab as p from scipy.optimize
import leastsq  

Projected_x = \ mat([[ -69.69  , 255.3825,    1.    ],
        [ -69.69  ,  224.6175,    1.    ],
        [-110.71  ,  224.6175,    1.    ],
        [-110.71  ,  255.3825,    1.    ],
        [ 709.69  ,  224.6175,    1.    ],
        [ 709.69  ,  255.3825,    1.    ],
        [ 750.71  ,  255.3825,    1.    ],
        [ 750.71  ,  224.6175,    1.    ]])

Projected_x = Projected_x.transpose()

Pmat = \ mat(   [[  5.79746167e+02,  0.00000000e+00,   3.20000000e+02,    0.00000000e+00],
        [  0.00000000e+00,   4.34809625e+02,   2.40000000e+02, 0.00000000e+00],
        [  0.00000000e+00,   0.00000000e+00,   1.00000000e+00, 0.00000000e+00] ]  )

reconst_X = \ mat([[-0.95238194, -0.58146697,  0.61506506,  0.00539229],
        [-0.99566105, -0.76178453,  0.72451719,  0.00502341],
        [-1.15401215, -0.81736486,  0.79417098,  0.00546999],
        [-1.11073304, -0.6370473 ,  0.68471885,  0.00583888],
        [ 2.71283058,  2.34190758, -1.80448545, -0.00612243],
        [ 2.7561097 ,  2.52222514, -1.91393758, -0.00575354],
        [ 2.9144608 ,  2.57780547, -1.98359137, -0.00620013],
        [ 2.87118168,  2.39748791, -1.87413925, -0.00656901]])

def residuals(p, y, x):
    err = y - p*x.transpose()

    err = err * err.transpose()

    return err

p0 = Pmat  

plsq = leastsq(residuals, p0, args=(Projected_x, reconst_X  )  )

print plsq[0]

Tags: 代码fromimport代表摄像机errtransposemat
2条回答

我的第一个猜测是:莱斯特斯克不喜欢矩阵

使用数组和美国运输部,或转换np.A阵列(err)在返回之前,可能会将p转换为残差函数中的矩阵。在

混合矩阵和数组是一个很难跟踪的问题。在

几件小事:

  1. 使用np.数组如果可以的话
  2. 不导入*

我已经把密码改了np.数组演示user333700的含义。另外,我将投影矩阵转换为12维向量,因为大多数优化器都希望变量以向量形式进行优化。在

运行下面编辑的代码时会遇到的错误是TypeError:输入参数不正确。我相信这是因为你试图用线性最小二乘法来寻找12个参数,但你只有8个约束条件。在

import numpy as np

import pylab as p
from scipy.optimize import leastsq

Projected_x = np.array([[ -69.69  , 255.3825,    1.    ],
        [ -69.69  ,  224.6175,    1.    ],
        [-110.71  ,  224.6175,    1.    ],
        [-110.71  ,  255.3825,    1.    ],
        [ 709.69  ,  224.6175,    1.    ],
        [ 709.69  ,  255.3825,    1.    ],
        [ 750.71  ,  255.3825,    1.    ],
        [ 750.71  ,  224.6175,    1.    ]])

Projected_x = Projected_x.transpose()

Pmat = np.array(   [  5.79746167e+02,  0.00000000e+00,   3.20000000e+02,    0.00000000e+00,
          0.00000000e+00,   4.34809625e+02,   2.40000000e+02, 0.00000000e+00,
          0.00000000e+00,   0.00000000e+00,   1.00000000e+00, 0.00000000e+00]   )

reconst_X = np.array([[-0.95238194, -0.58146697,  0.61506506,  0.00539229],
        [-0.99566105, -0.76178453,  0.72451719,  0.00502341],
        [-1.15401215, -0.81736486,  0.79417098,  0.00546999],
        [-1.11073304, -0.6370473 ,  0.68471885,  0.00583888],
        [ 2.71283058,  2.34190758, -1.80448545, -0.00612243],
        [ 2.7561097 ,  2.52222514, -1.91393758, -0.00575354],
        [ 2.9144608 ,  2.57780547, -1.98359137, -0.00620013],
        [ 2.87118168,  2.39748791, -1.87413925, -0.00656901]])

def residuals(p, y, x):
    err = y - np.dot(p.reshape(3,4),x.T)

    print p

    return np.sum(err**2, axis=0)

p0 = Pmat

plsq = leastsq(residuals, p0, args=(Projected_x, reconst_X  )  )

print plsq[0]

相关问题 更多 >