2017-02-10 7 views
6

を使用して式の行列を最小化:H3x3行列である私は次式で<code>H</code>を最小限に抑える必要があるOpenCVの

enter image description here

を。
Pnは3x1行列(ポイント)です。
Euclidean()は、2点間の距離を示します。
Dnが実際の距離です。

私はすべてm点に対して誤差が最小となるようHの値を最適化する必要Hm点(PMにP0)
の初期推定値を有しています。 (式の値はすべてわかっています) opencvまたはdlib(またはboost/NLoptを使用)を使用してこれを実装するにはどうすればよいですか?

+0

質問は不完全で不明です。まず、vectorにscalar(1)を追加することは一般的には定義されていません。第二に、あなたはあなたが最適化するものを持っていなければなりません。与えられたものは何ですか?最後に、式全体が行列型のオブジェクトを与えます(もし私がそれを正しく読んでいれば、それは最初の行列Hに合計が掛けられます)。そして、行列の最小化がわかりません。 – n0p

+0

スカラーではない(1)その次の点(n + 1)は全て下付き文字である。私はP(o)からP(m)までの点を持っています。私は行列Hの初期値を持っています。 – Deepak

+0

dlibの場合は、このページから始めることができます。http://dlib.net/optimization.html – paiv

答えて

3

ライブラリのfind_optimal_parameters機能のドキュメントは実際には十分ではありませんでしたが、この機能を使用する方法を示すgithubにある単体テストがあります。

私はあなたが尋ねた他のquestionを見ましたが、解決策はこの質問とは異なるものだったようです。しかし、ここでは、あなたが必要とするもの、またはそれに非常に近いものを計算するために、ライブラリをどのように使用するかの例があります(これについて私が聞いているのは初めてです)。おそらくDistanceQuality()関数を変更する必要があります(既存のループを2つのネストされたループに置き換えることにより)。

コード全体がハードコードされているため、エラー処理は行われず、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

レポ履歴によれば、2016年4月19日火曜日から追加され、バージョン19](http://dlib.net/release_notes。html)(18.18の直後)。 – n0p

関連する問題