opencv與eigen做svd的一些區別。

2021-10-01 05:29:00 字數 2001 閱讀 1051

主要想用eigen 的svd替換opencv的svd結果發現點問題。記錄一下防止忘了吧。

第乙個例子 。row大於col 兩組v結果是一致的。大小為5*5

int row = 9;

int col = 5;

std::vector> vec,,,

,,,,

,};cv::mat mat(row, col, cv_64fc1);

for (int y = 0; y < row; ++y)

}cv::mat w, u, vt, v;

cv::svd::compute(mat, w, u, vt, 4);

cout << "vt opecv = " << endl << vt.t() << endl;

//    mat ee = mat(vt.t()).colrange(row, col) * 1.0;

//    cout << "ee opencv = " << endl << ee << endl << endl;

matrixxd ddd = eigen::matrixxd::zero(row, col);

int cha = q.channels();

for (int i = 0; i < row; i++)

}jacobisvdsvd(ddd, computethinu | computethinv);

matrixxd u1, s1, v1;

vectorxd vs = svd.singularvalues();

u1 = svd.matrixu();

v1 = svd.matrixv();

cout << "v1 eigen = " << endl << v1 << endl << endl;

輸出:自己跑程式看一眼吧 不愛貼圖了。

改為 row小於col 結果就有很大不同了。首先opencv的結果v是乙個9*9的陣列。eigen結果是9*5的陣列

並且 opencv的v結果的轉置的前5列就是eigen求得的v陣列

int row = 5;

int col = 9;

std::vector> vec,,,

,,,,

,};cv::mat mat(row, col, cv_64fc1);

for (int y = 0; y < row; ++y)

}cv::mat w, u, vt, v;

cv::svd::compute(mat, w, u, vt, 4);

cout << "vt opecv = " << endl << vt.t() << endl;

//    mat ee = mat(vt.t()).colrange(row, col) * 1.0;

//    cout << "ee opencv = " << endl << ee << endl << endl;

matrixxd ddd = eigen::matrixxd::zero(row, col);

int cha = q.channels();

for (int i = 0; i < row; i++)

}jacobisvdsvd(ddd, computethinu | computethinv);

matrixxd u1, s1, v1;

vectorxd vs = svd.singularvalues();

u1 = svd.matrixu();

v1 = svd.matrixv();

cout << "v1 eigen = " << endl << v1 << endl << endl;

續:查到問題了 對eigen不熟悉啊 computethinu這個值改改就好 改改   但是 轉置是逃不掉得了.

再加乙個:bdcsvd   eigen一共有兩種svd分解方法。乙個是jacobisvd乙個是bdcsvd  。用法類似。

矩陣入門(Eigen和Opencv類似)

1 eigen矩陣定義 eigen定義 型別 行 列 matrix eg.matrix型別為浮點型3行4列的矩陣 1 2 3 4 2 2 3 4 3 2 3 4 2 預定義的特殊矩陣vector列矩陣 rowvector行矩陣 eg.vector3d matrix 為3行1列的矩陣 eg.rowve...

Eigen(安裝與使用)

eigen是乙個c 開源線性代數庫。它提供了快速的有關矩陣的線性代數運算,還包括解方程等功能。g2o sophus也都使用eigen來進行矩陣計算。安裝eigensudo apt get install libeigen3 dev查詢eigen在 sudo updatedb locate eigen...

KDL與Eigen資料轉換

在ros使用過程中,kdl和eigen是使用比較多的兩個庫了,兩個庫都各有優勢。比如kdl是針對機械人運動學的,可以用來求解正逆向運動學,速度 雅克比矩陣等,也支援力的表述,很方便,但對矩陣運算卻不是那麼方便,eigen有著強大的矩陣計算能力。其實kdl內部有些資料結構也是採用eigen的,比如jn...