SVD分解計算空間相似變換旋轉和平移矩陣

2021-10-06 22:50:56 字數 2174 閱讀 5704

//opencv 實現

void caculatert(const std::vector& pts1, const std::vector& pts2, cv::mat& r, cv::mat& t)

p1 = cv::point3d(cv::vec3d(p1) / n);

p2 = cv::point3d(cv::vec3d(p2) / n);

//2、去中心座標

cv::mat srcmat(3, n, cv_64fc1);

cv::mat dstmat(3, n, cv_64fc1);

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

cv::mat mats = srcmat * dstmat.t();

cv::mat matu, matw, matvt;

cv::svdecomp(mats, matw, matu, matvt);

cv::mat mattemp = matu * matvt;

double det = cv::determinant(mattemp);

double datm = ;

cv::mat matm(3, 3, cv_64fc1, datm);

r = matvt.t() * matm * matu.t();

cv::mat matp1 = (cv::mat_(3, 1) << p1.x, p1.y, p1.z);

cv::mat matp2 = (cv::mat_(3, 1) << p2.x, p2.y, p2.z);

t = matp2 - r * matp1;

}

// eigen庫實現

void caculatert(const std::vector& pts1, const std::vector& pts2, cv::mat& r, cv::mat& t)

p1 = cv::point3d(cv::vec3d(p1) / n);

p2 = cv::point3d(cv::vec3d(p2) / n);

// 得到去中心座標

std::vectorq1(n), q2(n);

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

//計算需要進行奇異值分解的 w = sum(qi * qi』轉置) compute q1*q2^t

eigen::matrix3d w = eigen::matrix3d::zero();

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

w += eigen::vector3d(q1[i].x, q1[i].y, q1[i].z) * eigen::vector3d(q2[i].x, q2[i].y, q2[i].z).transpose();

// 對 w 進行svd 奇異值分解

eigen::jacobisvdsvd(w, eigen::computefullu | eigen::computefullv);

eigen::matrix3d u = svd.matrixu();

eigen::matrix3d v = svd.matrixv();

// 計算旋轉 和平移矩陣 r 和 t, r= v *m* ut

double det = (u*v.transpose()).determinant();

eigen::matrix3d m;

m << 1, 0, 0, 0, 1, 0, 0, 0, det;

eigen::matrix3d r_ = v * m* (u.transpose());

// t = p' - r * p

eigen::vector3d t_ = eigen::vector3d(p2.x, p2.y, p2.z) - r_ * eigen::vector3d(p1.x, p1.y, p1.z);

// 格式轉換 convert to cv::mat

r = (cv::mat_(3, 3) <<

r_(0, 0), r_(0, 1), r_(0, 2),

r_(1, 0), r_(1, 1), r_(1, 2),

r_(2, 0), r_(2, 1), r_(2, 2)

);t = (cv::mat_(3, 1) << t_(0, 0), t_(1, 0), t_(2, 0));

}

參考:

奇異值分解 SVD 線性變換幾何意義

科學網 奇異值分解 線性變換的幾何意義 ps 一直以來對svd分解似懂非懂,此文為譯文,原文以細緻的分析 大量的視覺化圖形演示了svd的幾何意義。能在有限的篇幅把這個問題講解的如此清晰,實屬不易。原文舉了乙個簡單的影象處理問題,簡單形象,真心希望路過的各路朋友能從不同的角度闡述下自己對svd實際意義...

空間座標乘旋轉矩陣 三維空間中的旋轉變換與旋轉矩陣

在三維空間中,繞著x軸,y軸,z軸的旋轉可以使用4 4的矩陣表示,而根據左右手座標系的不同,又可分為左手座標系下的三維旋轉矩陣和右手座標系下的三維旋轉矩陣。1 左手座標系下的旋轉矩陣 設旋轉角為 角,而 角表示從軸的正方嚮往座標軸的反方向觀察,順時針旋轉的角度 在左手座標系下,順時針旋轉為旋轉的正方...

向量空間模型文件相似度計算實現(C )

讀者可以根據自己的需要進行加殼或改寫,本文權當拋磚引玉。筆者加的殼在 vsm模型介紹 using system using system.collections.generic using system.linq using system.text using system.text.regular...