2017-02-10 2 views
6

je dois minimiser H dans l'équation suivante:Réduire la matrice dans l'équation en utilisant OpenCV

enter image description here

H est 3x3 Matrix.
Pn est 3x1 matrice (point).
Euclidean() donne la distance entre 2 points.
Dn est la distance réelle.

je une estimation initiale de H et m des points (P0 à Pm)
je besoin d'optimiser la valeur de H de telle sorte que pour tous les points d'erreur m est réduite au minimum. (Toutes les valeurs de l'expression sont connues) Comment puis-je l'implémenter en utilisant opencv ou dlib (ou en utilisant boost/NLopt).

+0

La question est incomplète et peu claire. Premièrement, l'ajout de scalar (1) à vector n'est généralement pas défini. Deuxièmement, vous devez avoir quelque chose que vous optimisez en ce qui concerne. Qu'est-ce qui est donné? Et enfin, l'expression entière donnera un objet de type matriciel (si je le lis bien, c'est-à-dire que la matrice initiale H est multipliée par la somme) et je ne sais pas ce qu'est la minimisation matricielle. – n0p

+0

Ce n'est pas scalaire (1) son point suivant (n + 1) tout est en indice. J'ai les points P (o) à P (m). J'ai la valeur initiale de Matrix H. – Deepak

+0

Pour dlib, vous pouvez commencer à partir de cette page http://dlib.net/optimization.html – paiv

Répondre

3

Bien que la documentation de la fonction find_optimal_parameters de dlib bibliothèque était vraiment pas assez, il y a un test unitaire que vous pouvez trouver sur github qui montre comment utiliser la fonction.

J'ai vu l'autre question vous avez demandé et semble que la solution était quelque chose de différent que dans cette question. Cependant, voici un exemple, comment utiliser la bibliothèque (c'est la première fois que j'en entends parler) pour calculer ce dont vous avez besoin ou quelque chose de très proche. Probablement, vous devrez changer la fonction DistanceQuality() (en remplaçant la boucle existante par deux imbriqués) et je vous laisserai le faire vous-même.

Veuillez noter que tout ce qui se trouve dans le code est codé en dur, qu'aucune erreur de traitement n'est effectuée et que le test est effectué directement dans la fonction main() . Il y a beaucoup de travail à faire, même si vous pouvez trouver le code qui fonctionne à des fins d'illustration.

Here we go:

#include <iostream> 
#include <dlib/optimization.h> 
#include <dlib/optimization/find_optimal_parameters.h> 

using namespace dlib; 

typedef matrix<double, 3, 1> MyPoint; 

std::vector<MyPoint> points; 
std::vector<double> distances; 

double MyDistance(MyPoint point1, MyPoint point2) 
{ 
    double sum = 0; 
    for (int i = 0; i < 3; i++) 
    { 
     sum += (point1(i, 0) - point2(i, 0)) * (point1(i, 0) - point2(i, 0)); 
    } 
    return sqrt(sum); 
} 

double DistanceQuality(const matrix<double, 3, 3>& H) 
{ 
    double sum = 0; 

    for (int i = 0; i < points.size() - 1; i++) 
    { 
     auto proj1 = H*points[i]; 
     auto proj2 = H*points[i+1]; 
     sum += abs(MyDistance(proj1, proj2) - distances[i]); 
    } 
    return sum; 
} 

matrix<double, 3, 3> VecToMatrix(matrix<double, 0, 1> vec) 
{ 
    matrix<double, 3, 3> matrix; 
    for (int i = 0; i < 9; i++) 
    { 
     matrix(i/3, i % 3) = vec(i); 
    } 
    return matrix; 
} 

double test_function(matrix<double, 0, 1> H) 
{ 
    matrix<double, 3, 3> newH = VecToMatrix(H); 
    auto result = DistanceQuality(newH); 
    return result; 
} 

int main() 
{ 
    matrix<double, 3, 1> p1; 
    matrix<double, 3, 1> p2; 
    matrix<double, 3, 1> p3; 

    p1 = { 1, 1, 1 }; 
    p2 = { 2, 2, 3 }; 
    p3 = { 3, 1.6, 7}; 

    points.push_back(p1); 
    points.push_back(p2); 
    points.push_back(p3); 

    double d1 = 2.44949; 
    double d2 = 4.142463; 

    distances.push_back(d1); 
    distances.push_back(d2); 

    matrix<double, 0, 1> H; 
    H = { 3, 1, 1, 
     1, 1, 6, 
     1, 4, 1 }; 

    matrix<double, 0, 1> H_min; 
    matrix<double, 0, 1> H_max; 

    H_min = { 0.5, 0.6, 0.5, 
      0.5, 0.7, 0.5, 
      0.8, 0.3, 0.5, }; 

    H_max = { 10, 10, 10, 
      10, 10, 10, 
      10, 10, 10, }; 

    dlib::find_optimal_parameters(4, 0.001, 1000, H, H_min, H_max, test_function); 
    std::cout << "new H: " << std::endl << VecToMatrix(H) << std::endl; 

    return 0; 
} 

espère que vous pouvez adapter les paramètres pour vous cas précis.

+0

J'ai dlib-18.18 et je ne suis pas en mesure de trouver 'dlib/optimisation/find_optimal_parameters.h' – Deepak

+0

Selon l'historique des pensions, il a été ajouté depuis mardi, avril 19, 2016 02:11:38 et était sortie avec [ version 19] (http://dlib.net/release_notes.html) (juste après le 18.18). – n0p