2017-02-10 25 views
6

мне нужно минимизировать H в следующем уравнении:Минимизация матрицы в уравнении с использованием OpenCV

enter image description here

Где H является 3x3 Matrix.
Pn - 3x1 матрица (точка).
Euclidean() дает расстояние между 2 точками.
Dn - фактическое расстояние.

У меня есть один первоначальная оценка H и m точек (Р0 до Pm)
мне нужно оптимизировать значение из H, что для всех точек m сведено к минимуму ошибки. (Все значения в выражении известны) Как это реализовать, используя opencv или dlib (или с помощью boost/NLopt).

+0

Вопрос не заполнен и неясен. Во-первых, добавление скалярного (1) в вектор обычно не определяется. Во-вторых, у вас должно быть то, что вы оптимизируете в отношении. Что дается? И, наконец, целое выражение даст объект типа матрицы (если я правильно его читаю, то есть начальная матрица H умножается на сумму), и я не знаю, что такое минимизация матрицы. – n0p

+0

Его не скаляр (1) его следующая точка (n + 1) все находится в индексе. У меня есть точки P (o) до P (m). У меня есть начальное значение Matrix H. – Deepak

+0

Для dlib вы можете начать с этой страницы http://dlib.net/optimization.html – paiv

ответ

3

Хотя документация find_optimal_parameters функции dlib библиотеки действительно не хватает, есть тестовый модуль, который вы можете найти на github, который показывает, как использовать эту функцию.

Я видел другой question, который вы задали, и кажется, что решение было чем-то иным, чем в этом вопросе. Однако, вот пример, как использовать библиотеку (это первый раз, когда я слышу об этом), чтобы рассчитать, что вам нужно или что-то очень близкое к этому. Вероятно, вам нужно будет изменить функцию DistanceQuality() (заменив существующий цикл двумя вложенными), и я позволю вам сделать это самостоятельно.

Обратите внимание, что все на всем протяжении кода жестко закодировано, обработка ошибок не выполняется и тестирование выполняется прямо в функции main(). Есть много работы, которая должна быть выполнена, хотя вы можете найти код, работающий для иллюстративных целей.

Здесь мы идем:

#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; 
} 

Надеется, что вы можете адаптировать параметры для вас конкретного случая.

+0

У меня есть dlib-18.18, и я не могу найти 'dlib/optimization/find_optimal_parameters.h' – Deepak

+0

Согласно истории репо, он был добавлен со вторника, 19 апреля 2016 года 02:11:38 и был выпущен с [ версия 19] (http://dlib.net/release_notes.html) (сразу после 18.18). – n0p