1 #ifndef TAG_ABSORIENT_H_
2 #define TAG_ABSORIENT_H_
11 #include <TooN/TooN.h>
12 #include <TooN/sim2.h>
13 #include <TooN/sim3.h>
26 std::pair<TooN::Matrix<D>, TooN::DefaultPrecision>
computeOrientationScale(
const std::vector<TooN::Vector<D> > & a,
const std::vector<TooN::Vector<D> > & b ){
27 TooN::SizeMismatch<D,D>::test(a.front().size(), b.front().size());
28 const int DIM = a.front().size();
29 const size_t N = std::min(a.size(), b.size());
32 TooN::Matrix<D> s(DIM,DIM);
34 for(
size_t i = 0; i < N; i++){
35 s += b[i].as_col() * a[i].as_row();
43 TooN::Vector<D> S(DIM);
46 const TooN::DefaultPrecision eps = 1e-8;
47 const TooN::DefaultPrecision ds = determinant_gaussian_elimination(s);
51 const TooN::DefaultPrecision duv = TooN::determinant_gaussian_elimination(svd.get_U())
52 * TooN::determinant_gaussian_elimination(svd.get_VT());
58 TooN::DefaultPrecision scale = 0;
59 for(
int i = 0; i < DIM; ++i)
60 scale += svd.get_diagonal()[i] * S[i];
62 return std::make_pair(svd.get_U() * S.as_diagonal() * svd.get_VT(), scale);
76 inline TooN::Matrix<D>
computeRotation(
const std::vector<TooN::Vector<D> > & a,
const std::vector<TooN::Vector<D> > & b ){
89 inline TooN::SO3<>
computeOrientation(
const std::vector<TooN::Vector<3> > & a,
const std::vector<TooN::Vector<3> > & b ){
91 return TooN::SO3<>(result.first);
102 inline TooN::SO2<>
computeOrientation(
const std::vector<TooN::Vector<2> > & a,
const std::vector<TooN::Vector<2> > & b ){
104 return TooN::SO2<>(result.first);
115 TooN::SO3<>
computeOrientation(
const TooN::Vector<3> & a1,
const TooN::Vector<3> & b1,
const TooN::Vector<3> & a2,
const TooN::Vector<3> & b2 );
127 std::pair<TooN::Matrix<D>, TooN::Vector<D> >
computeAbsoluteOrientation(
const std::vector<TooN::Vector<D> > & a,
const std::vector<TooN::Vector<D> > & b){
128 TooN::SizeMismatch<D,D>::test(a.front().size(), b.front().size());
129 const int DIM = a.front().size();
130 const size_t N = std::min(a.size(), b.size());
133 TooN::Matrix<D> R(DIM, DIM);
135 return std::make_pair(R, b.front() - a.front());
142 TooN::Vector<D> ma = TooN::Zeros(DIM), mb = TooN::Zeros(DIM);
143 for(
unsigned i = 0; i < N; ++i){
151 std::vector<TooN::Vector<D> > ap(N), bp(N);
152 for(
unsigned i = 0; i < N; ++i){
159 return std::make_pair(Rs.first, mb - Rs.first * ma);
169 std::pair<TooN::Matrix<3>, TooN::Vector<3> > Rt = computeAbsoluteOrientation<3>( a, b );
170 return TooN::SE3<>(Rt.first, Rt.second);
180 std::pair<TooN::Matrix<2>, TooN::Vector<2> > Rt = computeAbsoluteOrientation<2>( a, b );
181 return TooN::SE2<>(Rt.first, Rt.second);
194 std::tr1::tuple<TooN::Matrix<D>, TooN::Vector<D>, TooN::DefaultPrecision >
computeSimilarity(
const std::vector<TooN::Vector<D> > & a,
const std::vector<TooN::Vector<D> > & b){
195 TooN::SizeMismatch<D,D>::test(a.front().size(), b.front().size());
196 const int DIM = a.front().size();
197 const size_t N = std::min(a.size(), b.size());
200 TooN::Matrix<D> R(DIM, DIM);
209 TooN::Vector<D> ma = TooN::Zeros(DIM), mb = TooN::Zeros(DIM);
210 for(
unsigned i = 0; i < N; ++i){
218 std::vector<TooN::Vector<D> > ap(N), bp(N);
219 for(
unsigned i = 0; i < N; ++i){
227 TooN::DefaultPrecision sa = 0;
228 for(
unsigned int i = 0; i < N; ++i){
229 sa += TooN::norm_sq(ap[i]);
232 const TooN::DefaultPrecision scale = Rs.second / sa;
242 inline TooN::SIM3<>
computeSimilarity(
const std::vector<TooN::Vector<3> > & a,
const std::vector<TooN::Vector<3> > & b){
243 std::tr1::tuple<TooN::Matrix<3>, TooN::Vector<3>, TooN::DefaultPrecision > Rts = computeSimilarity<3>(a,b);
244 return TooN::SIM3<>(TooN::SO3<>(std::tr1::get<0>(Rts)), std::tr1::get<1>(Rts), std::tr1::get<2>(Rts));
253 inline TooN::SIM2<>
computeSimilarity(
const std::vector<TooN::Vector<2> > & a,
const std::vector<TooN::Vector<2> > & b){
254 std::tr1::tuple<TooN::Matrix<2>, TooN::Vector<2>, TooN::DefaultPrecision > Rts = computeSimilarity<2>(a,b);
255 return TooN::SIM2<>(TooN::SO2<>(std::tr1::get<0>(Rts)), std::tr1::get<1>(Rts), std::tr1::get<2>(Rts));
273 #endif // TAG_ABSORIENT_H_