Минимизировать матрицу в уравнении, используя OpenCV

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

введите описание изображения здесь

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

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

6

Решение

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

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

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

Вот так:

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

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]