2010-10-19 15 views
2

J'ai essayé de faire un ajustement de paquet en python. Donc, je suis un module de test non-linéaire moins carré. Puis j'ai écrit du code comme ci-dessous. Je veux avoir raison Pmat représente la matrice de projection de caméra pour trois caméras. Mais j'ai une erreur, "ValueError: objet trop profond pour le tableau désiré".Les moindres carrés non linéaires de SciPy

Toute personne pouvant donner des indices pour résoudre ce problème?

Cordialement, 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] 

Répondre

3

ma première supposition: leastsq n'aime pas les matrices,

utiliser des tableaux et np.dot, ou convertir np.asarray (err) avant le retour, Et peut-être convertir p à l'intérieur de votre matrice résiduelle fonction.

Le mélange de matrices et de matrices peut être difficile à suivre.

1

Quelques petites choses:

  1. utilisation np.array si vous pouvez
  2. Ne pas importer *

J'ai changé le code à utiliser np.array pour démontrer ce que user333700 veux dire. De plus, je convertis la matrice de projection en un vecteur à 12 dimensions, car la plupart des optimiseurs s'attendent à ce que votre variable optimise sous forme vectorielle.

L'erreur que vous obtiendrez en exécutant le code édité ci-dessous est TypeError: paramètres d'entrée incorrects. Je crois que c'est parce que vous essayez d'effectuer les moindres carrés linéaires pour trouver 12 paramètres, mais vous avez seulement 8 contraintes.

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] 
Questions connexes