【问题标题】:SciPy's non-linear least squareSciPy 的非线性最小二乘法
【发布时间】:2010-10-19 07:00:08
【问题描述】:

我尝试通过 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]

【问题讨论】:

    标签: python scipy


    【解决方案1】:

    我的第一个猜测:leastsq 不喜欢矩阵,

    使用数组和 np.dot,或在返回之前转换 np.asarray(err),并可能在残差函数内将 p 转换为矩阵。

    混合矩阵和数组可能很难跟踪。

    【讨论】:

      【解决方案2】:

      一些小事:

      1. 如果可以,请使用 np.array
      2. 不要导入 *

      我已更改代码以使用 np.array 来演示 user333700 的含义。此外,我将投影矩阵转换为 12 维向量,因为大多数优化器都希望您的变量以向量形式进行优化。

      运行下面编辑的代码会出现错误是 TypeError: Improper input parameters。我相信这是因为您尝试执行线性最小二乘法以找到 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]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-27
        • 1970-01-01
        • 2017-02-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多