【问题标题】:Minimize matrix in Equation using OpenCV使用 OpenCV 最小化方程中的矩阵
【发布时间】:2017-02-10 10:38:10
【问题描述】:

我需要在以下等式中最小化H

其中H3x3 矩阵。
Pn 是3x1 矩阵(点)。
Euclidean() 给出 2 个点之间的距离。
Dn 是实际距离。

我有一个初步估计 Hm 点(P0 到 Pm)
我需要优化H 的值,以使所有m 点的错误最小化。 (表达式中的所有值都是已知的) 如何使用opencvdlib(或使用 boost/NLopt)来实现这一点。

【问题讨论】:

  • 问题不完整且不清楚。首先,通常没有定义将标量 (1) 添加到向量。其次,你必须有一些你可以优化的东西。给予什么?最后,整个表达式将给出一个矩阵类型的对象(如果我没看错的话,那就是初始矩阵 H 乘以总和),我不知道矩阵最小化是什么。
  • 它不是标量 (1) 它的下一个点 (n+1) 一切都在下标中。我有点 P(o) 到 P(m)。我有 Matrix H 的初始值。
  • 对于dlib,可以从这个页面开始dlib.net/optimization.html
  • @n0p 最小化 vrt H 的总和。它只是格式不好。
  • @n0p 我的方程式格式正确。

标签: c++ opencv dlib minimization nlopt


【解决方案1】:

虽然dlib 库的find_optimal_parameters 函数的文档确实不够,但是你可以在github 上找到一个单元测试,它显示了如何使用该函数。

我看到你问过的另一个question,似乎解决方案与这个问题不同。但是,这是一个示例,如何使用该库(这是我第一次听说它)来计算您需要的东西或非常接近的东西。可能您需要更改 DistanceQuality() 函数(通过将现有循环替换为两个嵌套循环),我会让您自己完成。

请注意,代码中的所有内容都是硬编码的,没有进行错误处理,并且测试直接在 ma​​in() 函数中完成。尽管您可以找到用于说明目的的代码,但仍有许多工作要做。

我们开始吧:

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

希望您可以根据具体情况调整参数。

【讨论】:

  • 我有 dlib-18.18 但我找不到dlib/optimization/find_optimal_parameters.h
  • 根据回购历史,它是从 2016 年 4 月 19 日星期二 02:11:38 开始添加的,并以 version 19 发布(紧随 18.18 之后)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
  • 2015-09-26
  • 2017-06-28
  • 2023-03-05
相关资源
最近更新 更多