Advertisement
Guest User

Untitled

a guest
Sep 3rd, 2015
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.66 KB | None | 0 0
  1. Mat_<double> Find2DRigidTransform(const vector<Point_<V> >& a, const vector<Point_<V> >& b,
  2. Point_<V>* diff = 0, V* angle = 0, V* scale = 0) {
  3. //use PCA to find relational scale
  4. Mat_<V> P; Mat(a).reshape(1,a.size()).copyTo(P);
  5. Mat_<V> Q; Mat(b).reshape(1,b.size()).copyTo(Q);
  6. PCA a_pca(P,Mat(),CV_PCA_DATA_AS_ROW), b_pca(Q,Mat(),CV_PCA_DATA_AS_ROW);
  7. double s = sqrt(b_pca.eigenvalues.at<V>(0)) / sqrt(a_pca.eigenvalues.at<V>(0));
  8. // cout << a_pca.eigenvectors << endl << a_pca.eigenvalues << endl << a_pca.mean << endl;
  9. // cout << b_pca.eigenvectors << endl << b_pca.eigenvalues << endl << b_pca.mean << endl;
  10.  
  11. //convert to matrices and subtract mean
  12.  
  13. Scalar a_m = Scalar(a_pca.mean.at<V>(0),a_pca.mean.at<V>(1));
  14. Scalar b_m = Scalar(b_pca.mean.at<V>(0),b_pca.mean.at<V>(1));
  15.  
  16. P -= repeat((Mat_<V>(1,2) << a_m[0],a_m[1]), P.rows, 1);
  17. Q -= repeat((Mat_<V>(1,2) << b_m[0],b_m[1]), Q.rows, 1);
  18.  
  19. //from http://en.wikipedia.org/wiki/Kabsch_algorithm
  20. Mat_<double> A = P.t() * Q;
  21. SVD svd(A);
  22. Mat_<double> C = svd.vt.t() * svd.u.t();
  23. double d = (determinant(C) > 0) ? 1 : -1;
  24. Mat_<double> R = svd.vt.t() * (Mat_<double>(2,2) << 1,0, 0,d) * svd.u.t();
  25. Mat_<double> T = (Mat_<double>(3,3) << 1,0,b_m[0]/s, 0,1,b_m[1]/s, 0,0,1) *
  26. (Mat_<double>(3,3) << s,0,0, 0,s,0, 0,0,s) *
  27. (Mat_<double>(3,3) << R(0,0),R(0,1),0, R(1,0),R(1,1),0, 0,0,1) *
  28. (Mat_<double>(3,3) << 1,0,-a_m[0], 0,1,-a_m[1], 0,0,1)
  29. ;
  30. if (diff!=NULL) {
  31. diff->x = b_m[0]-a_m[0];
  32. diff->y = b_m[1]-a_m[1];
  33. }
  34. if (angle!=NULL) {
  35. *angle = atan2(R(1,0),R(0,0));
  36. }
  37. if (scale!=NULL) {
  38. *scale = s;
  39. }
  40. return T(Range(0,2),Range::all());
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement