Нелинейный наименьший квадрат SciPy - PullRequest
2 голосов
/ 19 октября 2010

Я попытался выполнить настройку связки с помощью python.Итак, я тестирую нелинейный модуль наименьших квадратов.Затем я написал код, как показано ниже.Я хочу получить право Pmat представляет матрицу проецирования камеры для трех камер.Но у меня есть ошибка, "ValueError: объект слишком глубокий для нужного массива" .

Кто-нибудь, кто может дать подсказку, чтобы решить эту проблему?

С уважением, Jinho Yoo.

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]

Ответы [ 2 ]

3 голосов
/ 19 октября 2010

мое первое предположение: leastsq не любит матрицы,

используйте массивы и np.dot или преобразуйте np.asarray (err) перед возвратом, и, возможно, преобразуйте p в матрицу внутри остаточной функции.

Смешивание матриц и массивов может быть трудной задачей для отслеживания.

1 голос
/ 19 октября 2010

Пара маленьких вещей:

  1. используйте np.array, если можете
  2. Не импортировать *

Я изменил код для использования np.array, чтобы продемонстрировать, что означает 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...