1 #ifndef CVD_INCLUDE_CAMERA_H 2 #define CVD_INCLUDE_CAMERA_H 5 #include <TooN/helpers.h> 11 inline T SAT(T x) {
return (x < -1.0 / 3 ? -1e9 : x); }
28 void load(std::istream& is)
30 is >> my_camera_parameters;
34 void save(std::ostream& os)
const 36 os << my_camera_parameters;
40 inline TooN::Vector<2>
linearproject(
const TooN::Vector<2>& camframe, TooN::DefaultPrecision scale)
const 42 return TooN::Vector<2>(scale * diagmult(camframe, my_camera_parameters.slice<0, 2>()) + my_camera_parameters.slice<2, 2>());
45 inline TooN::Vector<2>
project(
const TooN::Vector<2>& camframe)
const 47 return TooN::Vector<2>(diagmult(camframe, my_camera_parameters.slice<0, 2>()) + my_camera_parameters.slice<2, 2>());
50 inline TooN::Vector<2>
unproject(
const TooN::Vector<2>& imframe)
const 52 TooN::Vector<2> my_last_camframe;
53 my_last_camframe[0] = (imframe[0] - my_camera_parameters[2]) / my_camera_parameters[0];
54 my_last_camframe[1] = (imframe[1] - my_camera_parameters[3]) / my_camera_parameters[1];
55 return my_last_camframe;
62 TooN::Matrix<2, 2> result;
63 result(0, 0) = my_camera_parameters[0];
64 result(1, 1) = my_camera_parameters[1];
65 result(0, 1) = result(1, 0) = 0;
72 TooN::Vector<num_parameters>
get_parameter_derivs(
const TooN::Vector<2>& pos,
const TooN::Vector<2>& direction)
const 74 TooN::Vector<num_parameters> result;
75 result[0] = pos[0] * direction[0];
76 result[1] = pos[1] * direction[1];
77 result[2] = direction[0];
78 result[3] = direction[1];
85 TooN::Matrix<num_parameters, 2> result;
86 result(0, 0) = pos[0];
89 result(1, 1) = pos[1];
100 void update(
const TooN::Vector<num_parameters>& updates)
102 my_camera_parameters += updates;
107 inline TooN::Vector<num_parameters>&
get_parameters() {
return my_camera_parameters; }
108 inline const TooN::Vector<num_parameters>&
get_parameters()
const {
return my_camera_parameters; }
111 TooN::Vector<num_parameters> my_camera_parameters;
124 inline void load(std::istream& is);
127 inline void save(std::ostream& os)
const;
130 inline TooN::Vector<2>
linearproject(
const TooN::Vector<2>& camframe, TooN::DefaultPrecision scale = 1)
const;
132 inline TooN::Vector<2>
project(
const TooN::Vector<2>& camframe)
const;
134 inline TooN::Vector<2>
unproject(
const TooN::Vector<2>& imframe)
const;
143 inline TooN::Vector<num_parameters>
get_parameter_derivs(
const TooN::Vector<2>& pos,
const TooN::Vector<2>& direction)
const;
145 inline TooN::Matrix<Camera::Cubic::num_parameters, 2>
get_parameter_derivs(
const TooN::Vector<2>& pos)
const;
150 inline void update(
const TooN::Vector<num_parameters>& updates);
154 inline TooN::Vector<num_parameters>&
get_parameters() {
return my_camera_parameters; }
155 inline const TooN::Vector<num_parameters>&
get_parameters()
const {
return my_camera_parameters; }
158 TooN::Vector<num_parameters> my_camera_parameters;
171 inline void load(std::istream& is);
174 inline void save(std::ostream& os)
const;
177 inline TooN::Vector<2>
linearproject(
const TooN::Vector<2>& camframe, TooN::DefaultPrecision scale = 1)
const;
180 inline TooN::Vector<2>
project_vector(
const TooN::Vector<2>& x,
const TooN::Vector<2>& d)
const 182 const TooN::DefaultPrecision xsq = x * x;
183 const TooN::DefaultPrecision& a = my_camera_parameters[4];
184 const TooN::DefaultPrecision& b = my_camera_parameters[5];
185 return (2 * (a + 2 * b * xsq) * (x * d) * TooN::diagmult(my_camera_parameters.slice<0, 2>(), x) + (1 + a * xsq + b * xsq * xsq) * TooN::diagmult(my_camera_parameters.slice<0, 2>(), d));
188 inline TooN::Vector<2> project_vector(
const TooN::Vector<2>& d)
const 190 return diagmult(my_camera_parameters.slice<0, 2>(), d);
192 inline TooN::Vector<2> unproject_vector(
const TooN::Vector<2>& d)
const 195 v[0] = d[0] / my_camera_parameters[0];
196 v[1] = d[1] / my_camera_parameters[1];
199 inline TooN::Vector<2>
project(
const TooN::Vector<2>& camframe)
const;
200 inline std::pair<TooN::Vector<2>, TooN::Matrix<2>>
project(
const TooN::Vector<2>& camframe,
const TooN::Matrix<2>& R)
const;
203 inline TooN::Vector<2>
unproject(
const TooN::Vector<2>& imframe)
const;
205 inline std::pair<TooN::Vector<2>, TooN::Matrix<2>>
unproject(
const TooN::Vector<2>& imframe,
const TooN::Matrix<2>& R)
const;
209 inline TooN::Matrix<2, 2> get_derivative()
const;
210 inline TooN::Matrix<2, 2> get_derivative(
const TooN::Vector<2>& x)
const;
212 inline TooN::Matrix<2, 2> get_inv_derivative()
const;
213 inline TooN::Matrix<2, 2> get_inv_derivative(
const TooN::Vector<2>& x)
const;
221 inline TooN::Vector<num_parameters>
get_parameter_derivs(
const TooN::Vector<2>& direction)
const;
226 inline void update(
const TooN::Vector<num_parameters>& updates);
230 inline const TooN::Vector<num_parameters>&
get_parameters()
const {
return my_camera_parameters; }
233 inline TooN::Vector<num_parameters>&
get_parameters() {
return my_camera_parameters; }
236 TooN::Vector<num_parameters> my_camera_parameters;
237 mutable TooN::Vector<2> my_last_camframe;
239 inline TooN::DefaultPrecision sat(TooN::DefaultPrecision x)
241 TooN::DefaultPrecision a;
242 a = (-3 * my_camera_parameters[4] - sqrt(9 * my_camera_parameters[4] * my_camera_parameters[4] - 20 * my_camera_parameters[5])) / (10 * my_camera_parameters[5]);
265 TooN::Vector<2> radial_distort(
const TooN::Vector<2>& camframe)
const 267 TooN::DefaultPrecision r2 = camframe * camframe;
268 return camframe / sqrt(1 + my_camera_parameters[4] * r2);
277 inline void load(std::istream& is)
279 is >> my_camera_parameters;
284 inline void save(std::ostream& os)
const 286 os << my_camera_parameters;
290 inline TooN::Vector<2>
linearproject(
const TooN::Vector<2>& camframe, TooN::DefaultPrecision scale = 1)
const 292 return TooN::Vector<2>(scale * diagmult(camframe, my_camera_parameters.slice<0, 2>()) + my_camera_parameters.slice<2, 2>());
296 inline TooN::Vector<2>
project(
const TooN::Vector<2>& camframe)
const 302 inline TooN::Vector<2>
unproject(
const TooN::Vector<2>& imframe)
const 305 TooN::Vector<2> mod_camframe;
306 mod_camframe[0] = (imframe[0] - my_camera_parameters[2]) / my_camera_parameters[0];
307 mod_camframe[1] = (imframe[1] - my_camera_parameters[3]) / my_camera_parameters[1];
308 TooN::DefaultPrecision rprime2 = mod_camframe * mod_camframe;
309 return mod_camframe / sqrt(1 - my_camera_parameters[4] * rprime2);
318 TooN::Matrix<2, 2> J;
320 TooN::DefaultPrecision xc = pt[0];
321 TooN::DefaultPrecision yc = pt[1];
323 TooN::DefaultPrecision fu = my_camera_parameters[0];
324 TooN::DefaultPrecision fv = my_camera_parameters[1];
325 TooN::DefaultPrecision a = my_camera_parameters[4];
327 TooN::DefaultPrecision g = 1 / sqrt(1 + a * (xc * xc + yc * yc));
328 TooN::DefaultPrecision g3 = g * g * g;
330 J[0][0] = fu * (g - a * xc * xc * g3);
331 J[0][1] = -fu * a * xc * yc * g3;
332 J[1][0] = -fv * a * xc * yc * g3;
333 J[1][1] = fv * (g - a * yc * yc * g3);
342 TooN::Vector<2> mod_camframe = radial_distort(pt);
344 TooN::Matrix<5, 2> result;
346 TooN::DefaultPrecision xc = pt[0];
347 TooN::DefaultPrecision yc = pt[1];
348 TooN::DefaultPrecision r2 = xc * xc + yc * yc;
350 TooN::DefaultPrecision fu = my_camera_parameters[0];
351 TooN::DefaultPrecision fv = my_camera_parameters[1];
352 TooN::DefaultPrecision a = my_camera_parameters[4];
354 TooN::DefaultPrecision g = 1 / sqrt(1 + a * r2);
355 TooN::DefaultPrecision g3 = g * g * g;
358 result[0][0] = mod_camframe[0];
362 result[4][0] = -fu * xc * r2 / 2 * g3;
366 result[1][1] = mod_camframe[1];
369 result[4][1] = -fv * yc * r2 / 2 * g3;
377 inline TooN::Vector<num_parameters>
get_parameter_derivs(
const TooN::Vector<2>& position,
const TooN::Vector<2>& direction)
const 379 return get_parameter_derivs_at(position) * direction;
391 return my_camera_parameters;
395 return my_camera_parameters;
399 TooN::Vector<num_parameters> my_camera_parameters;
408 TooN::Vector<2> radial_distort(
const TooN::Vector<2>& camframe)
const 410 TooN::DefaultPrecision r2 = camframe * camframe;
411 return camframe / sqrt(1 + my_camera_parameters[4] * r2);
420 inline void load(std::istream& is)
422 is >> my_camera_parameters;
427 inline void save(std::ostream& os)
const 429 os << my_camera_parameters;
433 inline TooN::Vector<2>
linearproject(
const TooN::Vector<2>& camframe, TooN::DefaultPrecision scale = 1)
const 435 return TooN::Vector<2>(scale * (camframe * my_camera_parameters[0]) + my_camera_parameters.slice<2, 2>());
439 inline TooN::Vector<2>
project(
const TooN::Vector<2>& camframe)
const 441 my_last_camframe = camframe;
446 inline TooN::Vector<2>
unproject(
const TooN::Vector<2>& imframe)
const 449 TooN::Vector<2> mod_camframe;
450 mod_camframe[0] = (imframe[0] - my_camera_parameters[2]) / my_camera_parameters[0];
451 mod_camframe[1] = (imframe[1] - my_camera_parameters[3]) / my_camera_parameters[0];
452 TooN::DefaultPrecision rprime2 = mod_camframe * mod_camframe;
453 my_last_camframe = mod_camframe / sqrt(1 - my_camera_parameters[4] * rprime2);
454 return my_last_camframe;
461 TooN::Matrix<2, 2> J;
463 TooN::DefaultPrecision xc = my_last_camframe[0];
464 TooN::DefaultPrecision yc = my_last_camframe[1];
466 TooN::DefaultPrecision f = my_camera_parameters[0];
467 TooN::DefaultPrecision a = my_camera_parameters[4];
469 TooN::DefaultPrecision g = 1 / sqrt(1 + a * (xc * xc + yc * yc));
470 TooN::DefaultPrecision g3 = g * g * g;
472 J[0][0] = f * (g - 2 * a * xc * xc * g3);
473 J[0][1] = -2 * f * a * xc * yc * g3;
474 J[1][0] = -2 * f * a * xc * yc * g3;
475 J[1][1] = f * (g - 2 * a * yc * yc * g3);
483 TooN::Vector<2> mod_camframe = radial_distort(my_last_camframe);
485 TooN::Matrix<5, 2> result;
487 TooN::DefaultPrecision xc = my_last_camframe[0];
488 TooN::DefaultPrecision yc = my_last_camframe[1];
489 TooN::DefaultPrecision r2 = xc * xc + yc * yc;
491 TooN::DefaultPrecision f = my_camera_parameters[0];
492 TooN::DefaultPrecision a = my_camera_parameters[4];
494 TooN::DefaultPrecision g = 1 / sqrt(1 + a * r2);
495 TooN::DefaultPrecision g3 = g * g * g;
498 result[0][0] = mod_camframe[0];
502 result[4][0] = -f * xc * r2 / 2 * g3;
505 result[0][1] = mod_camframe[1];
509 result[4][1] = -f * yc * r2 / 2 * g3;
531 my_camera_parameters[1] = 0;
532 return my_camera_parameters;
536 TooN::Vector<num_parameters> my_camera_parameters;
537 mutable TooN::Vector<2> my_last_camframe;
553 TooN::Vector<2> radial_distort(
const TooN::Vector<2>& camframe)
const 555 const TooN::DefaultPrecision r2 = camframe * camframe;
556 const TooN::DefaultPrecision w2 = my_camera_parameters[4] * my_camera_parameters[4];
557 const TooN::DefaultPrecision factor = w2 * r2;
558 TooN::DefaultPrecision term = 1.0;
559 TooN::DefaultPrecision scale = term;
566 return (scale * camframe);
575 inline void load(std::istream& is)
577 is >> my_camera_parameters;
582 inline void save(std::ostream& os)
const 584 os << my_camera_parameters;
588 inline TooN::Vector<2>
linearproject(
const TooN::Vector<2>& camframe, TooN::DefaultPrecision scale = 1)
const 590 return TooN::Vector<2>(scale * diagmult(camframe, my_camera_parameters.slice<0, 2>()) + my_camera_parameters.slice<2, 2>());
594 inline TooN::Vector<2>
project(
const TooN::Vector<2>& camframe)
const 600 inline TooN::Vector<2>
unproject(
const TooN::Vector<2>& imframe)
const 603 TooN::Vector<2> mod_camframe;
604 mod_camframe[0] = (imframe[0] - my_camera_parameters[2]) / my_camera_parameters[0];
605 mod_camframe[1] = (imframe[1] - my_camera_parameters[3]) / my_camera_parameters[1];
606 const TooN::DefaultPrecision rprime2 = mod_camframe * mod_camframe;
609 TooN::DefaultPrecision scale = mod_camframe * mod_camframe;
611 const TooN::DefaultPrecision w2 = my_camera_parameters[4] * my_camera_parameters[4];
612 const TooN::DefaultPrecision k3 = -w2 / 3.0;
613 const TooN::DefaultPrecision k5 = w2 * w2 / 5.0;
614 const TooN::DefaultPrecision k7 = -w2 * w2 * w2 / 7.0;
617 for(
int i = 0; i < 3; i++)
619 TooN::DefaultPrecision temp = 1 + scale * (k3 + scale * (k5 + scale * k7));
620 TooN::DefaultPrecision error = rprime2 - scale * temp * temp;
621 TooN::DefaultPrecision deriv = temp * (temp + 2 * scale * (k3 + 2 * scale * (k5 + 1.5 * scale * k7)));
622 scale += error / deriv;
624 return mod_camframe / (1 + scale * (k3 + scale * (k5 + scale * k7)));
632 TooN::Matrix<2, 2> J = TooN::Identity;
633 TooN::DefaultPrecision r2 = pt * pt;
634 const TooN::DefaultPrecision w2 = my_camera_parameters[4] * my_camera_parameters[4];
635 const TooN::DefaultPrecision k3 = -w2 / 3.0;
636 const TooN::DefaultPrecision k5 = w2 * w2 / 5.0;
637 const TooN::DefaultPrecision k7 = -w2 * w2 * w2 / 7.0;
638 J *= (1 + k3 * r2 + k5 * r2 * r2 + k7 * r2 * r2 * r2);
639 J += ((2 * k3 + 4 * k5 * r2 + 6 * k7 * r2 * r2) * pt.as_col()) * pt.as_row();
640 J[0] *= my_camera_parameters[0];
641 J[1] *= my_camera_parameters[1];
649 TooN::Vector<2> mod_camframe = radial_distort(pt);
651 TooN::Matrix<5, 2> result;
653 const TooN::DefaultPrecision xc = pt[0];
654 const TooN::DefaultPrecision yc = pt[1];
655 const TooN::DefaultPrecision r2 = xc * xc + yc * yc;
656 const TooN::DefaultPrecision r4 = r2 * r2;
657 const TooN::DefaultPrecision r6 = r4 * r2;
659 const TooN::DefaultPrecision fu = my_camera_parameters[0];
660 const TooN::DefaultPrecision fv = my_camera_parameters[1];
662 const TooN::DefaultPrecision w = my_camera_parameters[4];
663 const TooN::DefaultPrecision w3 = w * w * w;
664 const TooN::DefaultPrecision w5 = w3 * w * w;
666 const TooN::DefaultPrecision k1 = -(2.0 / 3.0) * w * r2;
667 const TooN::DefaultPrecision k2 = (4.0 / 5.0) * w3 * r4;
668 const TooN::DefaultPrecision k3 = -(6.0 / 7.0) * w5 * r6;
671 result[0][0] = mod_camframe[0];
675 result[4][0] = fu * (k1 + k2 + k3) * xc;
679 result[1][1] = mod_camframe[1];
682 result[4][1] = fv * (k1 + k2 + k3) * yc;
690 inline TooN::Vector<num_parameters>
get_parameter_derivs(
const TooN::Vector<2>& pos,
const TooN::Vector<2>& direction)
const 692 return get_parameter_derivs_at(pos) * direction;
704 return my_camera_parameters;
708 return my_camera_parameters;
712 TooN::Vector<num_parameters> my_camera_parameters;
723 using C::num_parameters;
724 TooN::Vector<2>
project(
const TooN::Vector<2>& v)
const 726 my_last_camframe = v;
727 return C::project(v);
730 TooN::Matrix<2> get_derivative()
const 732 return C::get_derivative_at(my_last_camframe);
737 return C::get_parameter_derivs_at(my_last_camframe);
740 TooN::Vector<2>
unproject(
const TooN::Vector<2>& v)
const 742 my_last_camframe = C::unproject(v);
743 return my_last_camframe;
747 mutable TooN::Vector<2> my_last_camframe;
758 is >> my_camera_parameters;
763 os << my_camera_parameters;
768 return TooN::Vector<2>(scale * diagmult(camframe, my_camera_parameters.slice<0, 2>()) + my_camera_parameters.slice<2, 2>());
773 TooN::Vector<2> mod_camframe = camframe * (1 + SAT(my_camera_parameters[4] * (camframe * camframe)));
774 return TooN::Vector<2>(diagmult(mod_camframe, my_camera_parameters.slice<0, 2>()) + my_camera_parameters.slice<2, 2>());
779 TooN::Vector<2> mod_camframe;
780 mod_camframe[0] = (imframe[0] - my_camera_parameters[2]) / my_camera_parameters[0];
781 mod_camframe[1] = (imframe[1] - my_camera_parameters[3]) / my_camera_parameters[1];
784 TooN::DefaultPrecision scale = 1 + my_camera_parameters[4] * (mod_camframe * mod_camframe);
787 for(
int i = 0; i < 3; i++)
789 TooN::DefaultPrecision error = my_camera_parameters[4] * (mod_camframe * mod_camframe) - scale * scale * (scale - 1);
790 TooN::DefaultPrecision deriv = (3 * scale - 2) * scale;
791 scale += error / deriv;
793 return mod_camframe / scale;
798 TooN::Matrix<2, 2> result = TooN::Identity;
799 result *= 1 + my_camera_parameters[4] * (pos * pos);
800 result += (2 * my_camera_parameters[4] * pos.as_col()) * pos.as_row();
801 result[0] *= my_camera_parameters[0];
802 result[1] *= my_camera_parameters[1];
808 TooN::Vector<2> mod_camframe = pos * (1 + my_camera_parameters[4] * (pos * pos));
809 TooN::Matrix<num_parameters, 2> result;
810 result(0, 0) = mod_camframe[0] * my_camera_parameters[0];
813 result(1, 1) = mod_camframe[1] * my_camera_parameters[1];
814 result(2, 0) = 1 * my_camera_parameters[0];
817 result(3, 1) = 1 * my_camera_parameters[1];
818 result[4] = diagmult(pos, my_camera_parameters.slice<0, 2>()) * (pos * pos);
824 TooN::Vector<2> mod_camframe = pos * (1 + my_camera_parameters[4] * (pos * pos));
825 TooN::Vector<num_parameters> result;
826 result[0] = mod_camframe[0] * direction[0] * my_camera_parameters[0];
827 result[1] = mod_camframe[1] * direction[1] * my_camera_parameters[1];
828 result[2] = direction[0] * my_camera_parameters[0];
829 result[3] = direction[1] * my_camera_parameters[1];
830 result[4] = (diagmult(pos, my_camera_parameters.slice<0, 2>()) * direction) * (pos * pos);
836 TooN::DefaultPrecision fu = my_camera_parameters[0];
837 TooN::DefaultPrecision fv = my_camera_parameters[1];
838 my_camera_parameters[0] += fu * updates[0];
839 my_camera_parameters[1] += fv * updates[1];
840 my_camera_parameters[2] += fu * updates[2];
841 my_camera_parameters[3] += fv * updates[3];
842 my_camera_parameters[4] += updates[4];
852 is >> my_camera_parameters;
857 os << my_camera_parameters;
862 return TooN::Vector<2>(scale * diagmult(camframe, my_camera_parameters.slice<0, 2>()) + my_camera_parameters.slice<2, 2>());
865 inline TooN::Vector<2> Camera::Quintic::project(
const TooN::Vector<2>& camframe)
const 867 my_last_camframe = camframe;
868 TooN::DefaultPrecision sc = (camframe * camframe);
869 TooN::Vector<2> mod_camframe = camframe * (1 + sc * (my_camera_parameters[4] + sc * my_camera_parameters[5]));
870 return TooN::Vector<2>(diagmult(mod_camframe, my_camera_parameters.slice<0, 2>()) + my_camera_parameters.slice<2, 2>());
873 inline std::pair<TooN::Vector<2>, TooN::Matrix<2>> Camera::Quintic::project(
const TooN::Vector<2>& camframe,
const TooN::Matrix<2>& R)
const 875 std::pair<TooN::Vector<2>, TooN::Matrix<2>> result;
876 result.first = this->
project(camframe);
877 const TooN::Matrix<2> J = this->get_derivative();
878 result.second = J * R * J.T();
884 TooN::Vector<2> mod_camframe;
885 mod_camframe[0] = (imframe[0] - my_camera_parameters[2]) / my_camera_parameters[0];
886 mod_camframe[1] = (imframe[1] - my_camera_parameters[3]) / my_camera_parameters[1];
889 TooN::DefaultPrecision scale = mod_camframe * mod_camframe;
892 for(
int i = 0; i < 3; i++)
894 TooN::DefaultPrecision temp = 1 + scale * (my_camera_parameters[4] + my_camera_parameters[5] * scale);
895 TooN::DefaultPrecision error = mod_camframe * mod_camframe - scale * temp * temp;
896 TooN::DefaultPrecision deriv = temp * (temp + 2 * scale * (my_camera_parameters[4] + 2 * my_camera_parameters[5] * scale));
897 scale += error / deriv;
899 my_last_camframe = mod_camframe / (1 + scale * (my_camera_parameters[4] + my_camera_parameters[5] * scale));
903 return my_last_camframe;
906 inline std::pair<TooN::Vector<2>, TooN::Matrix<2>>
Camera::Quintic::unproject(
const TooN::Vector<2>& imframe,
const TooN::Matrix<2>& R)
const 908 std::pair<TooN::Vector<2>, TooN::Matrix<2>> result;
910 TooN::Matrix<2> J = get_derivative();
911 TooN::DefaultPrecision rdet = 1 / (J[0][0] * J[1][1] - J[0][1] * J[1][0]);
912 TooN::Matrix<2> Jinv;
913 Jinv[0][0] = rdet * J[1][1];
914 Jinv[1][1] = rdet * J[0][0];
915 Jinv[0][1] = -rdet * J[0][1];
916 Jinv[1][0] = -rdet * J[1][0];
917 result.second = Jinv * R * Jinv.T();
923 TooN::Matrix<2, 2> result = TooN::Identity;
924 TooN::DefaultPrecision temp1 = my_last_camframe * my_last_camframe;
925 TooN::DefaultPrecision temp2 = my_camera_parameters[5] * temp1;
926 result *= 1 + temp1 * (my_camera_parameters[4] + temp2);
927 result += (2 * (my_camera_parameters[4] + 2 * temp2) * my_last_camframe.as_col()) * my_last_camframe.as_row();
928 result[0] *= my_camera_parameters[0];
929 result[1] *= my_camera_parameters[1];
933 TooN::Matrix<2, 2> Camera::Quintic::get_inv_derivative()
const 935 TooN::Matrix<2, 2> result = TooN::Identity;
936 TooN::DefaultPrecision temp1 = my_last_camframe * my_last_camframe;
937 TooN::DefaultPrecision temp2 = my_camera_parameters[5] * temp1;
938 TooN::DefaultPrecision temp3 = 2 * (my_camera_parameters[4] + 2 * temp2);
940 result *= 1 + temp1 * (my_camera_parameters[4] + temp2);
942 result[0][0] += my_last_camframe[1] * my_last_camframe[1] * temp3;
943 result[0][1] = -(temp3 * my_last_camframe[0] * my_last_camframe[1]);
945 result[1][1] += my_last_camframe[0] * my_last_camframe[0] * temp3;
946 result[1][0] = -(temp3 * my_last_camframe[0] * my_last_camframe[1]);
948 (result.T())[0] *= my_camera_parameters[1];
949 (result.T())[1] *= my_camera_parameters[0];
951 result /= (result[0][0] * result[1][1] - result[1][0] * result[0][1]);
956 TooN::Matrix<2, 2> Camera::Quintic::get_inv_derivative(
const TooN::Vector<2>& x)
const 959 TooN::Matrix<2, 2> result = TooN::Identity;
960 TooN::DefaultPrecision temp1 = x * x;
961 TooN::DefaultPrecision temp2 = my_camera_parameters[5] * temp1;
962 TooN::DefaultPrecision temp3 = 2 * (my_camera_parameters[4] + 2 * temp2);
964 result *= 1 + temp1 * (my_camera_parameters[4] + temp2);
967 result[0][0] += x[1] * x[1] * temp3;
968 result[0][1] = -(temp3 * x[0] * x[1]);
970 result[1][1] += x[0] * x[0] * temp3;
971 result[1][0] = -(temp3 * x[0] * x[1]);
973 (result.T())[0] *= my_camera_parameters[1];
974 (result.T())[1] *= my_camera_parameters[0];
976 result /= (result[0][0] * result[1][1] - result[1][0] * result[0][1]);
983 TooN::Matrix<2, 2> result = TooN::Identity;
984 TooN::DefaultPrecision temp1 = x * x;
985 TooN::DefaultPrecision temp2 = my_camera_parameters[5] * temp1;
986 result *= 1 + temp1 * (my_camera_parameters[4] + temp2);
988 result += (2 * (my_camera_parameters[4] + 2 * temp2) * x.as_col()) * x.as_row();
989 result[0] *= my_camera_parameters[0];
990 result[1] *= my_camera_parameters[1];
996 TooN::Matrix<num_parameters, 2> result;
997 TooN::DefaultPrecision r2 = my_last_camframe * my_last_camframe;
998 TooN::DefaultPrecision r4 = r2 * r2;
999 TooN::Vector<2> mod_camframe = my_last_camframe * (1 + r2 * (my_camera_parameters[4] + r2 * my_camera_parameters[5]));
1001 result(0, 0) = mod_camframe[0];
1005 result(4, 0) = my_camera_parameters[0] * my_last_camframe[0] * r2;
1006 result(5, 0) = my_camera_parameters[0] * my_last_camframe[0] * r4;
1009 result(1, 1) = mod_camframe[1];
1012 result(4, 1) = my_camera_parameters[1] * my_last_camframe[1] * r2;
1013 result(5, 1) = my_camera_parameters[1] * my_last_camframe[1] * r4;
1029 TooN::DefaultPrecision fu = my_camera_parameters[0];
1030 TooN::DefaultPrecision fv = my_camera_parameters[1];
1032 my_camera_parameters[0] += updates[0] * fu;
1033 my_camera_parameters[1] += updates[1] * fv;
1034 my_camera_parameters[2] += updates[2] * fu;
1035 my_camera_parameters[3] += updates[3] * fv;
1036 my_camera_parameters[4] += updates[4];
1037 my_camera_parameters[5] += updates[5];
TooN::Vector< num_parameters > & get_parameters()
Returns the vector of camera parameters in the format .
Definition: camera.h:107
TooN::Vector< 2 > unproject(const TooN::Vector< 2 > &imframe) const
Project from image plane to a Euclidean camera.
Definition: camera.h:777
TooN::Vector< num_parameters > & get_parameters()
Returns the vector of camera parameters in the format .
Definition: camera.h:233
TooN::Vector< 2 > unproject(const TooN::Vector< 2 > &imframe) const
Project from image plane to a Euclidean camera.
Definition: camera.h:50
void save(std::ostream &os) const
Save parameters to a stream.
Definition: camera.h:855
TooN::Matrix< 2, 2 > get_derivative() const
Get the derivative of image frame wrt camera frame at the last computed projection in the form ...
Definition: camera.h:459
All classes and functions are within the CVD namespace.
Definition: argb.h:6
TooN::Vector< num_parameters > & get_parameters()
Update the internal camera parameters by adding the vector given.
Definition: camera.h:529
void save(std::ostream &os) const
Save parameters to a stream.
Definition: camera.h:761
void save(std::ostream &os) const
Save parameters to a stream.
Definition: camera.h:582
void load(std::istream &is)
Load parameters from a stream.
Definition: camera.h:277
void update(const TooN::Vector< num_parameters > &updates)
Update the internal camera parameters by adding the vector given.
Definition: camera.h:1027
TooN::Vector< 2 > linearproject(const TooN::Vector< 2 > &camframe, TooN::DefaultPrecision scale=1) const
Fast linear projection for working out what's there.
Definition: camera.h:588
TooN::Vector< num_parameters > & get_parameters()
Update the internal camera parameters by adding the vector given.
Definition: camera.h:389
TooN::Vector< num_parameters > get_parameter_derivs(const TooN::Vector< 2 > &pos, const TooN::Vector< 2 > &direction) const
Get the component of the motion of a point in the direction provided with respect to each of the inte...
Definition: camera.h:822
TooN::Matrix< 2, 2 > get_derivative_at(const TooN::Vector< 2 > &) const
Get the derivative of image frame wrt camera frame in the form .
Definition: camera.h:60
static const int num_parameters
The number of parameters in the camera.
Definition: camera.h:24
void load(std::istream &is)
Load parameters from a stream.
Definition: camera.h:575
TooN::Matrix< 2, 2 > get_derivative() const
Get the derivative of image frame wrt camera frame at the last computed projection in the form ...
Definition: camera.h:921
This camera class is a very similar to the Harris model.
Definition: camera.h:404
TooN::Vector< 2 > unproject(const TooN::Vector< 2 > &imframe) const
Project from image plane to a Euclidean camera.
Definition: camera.h:446
TooN::Vector< 2 > linearproject(const TooN::Vector< 2 > &camframe, TooN::DefaultPrecision scale=1) const
Fast linear projection for working out what's there.
Definition: camera.h:290
TooN::Vector< num_parameters > get_parameter_derivs(const TooN::Vector< 2 > &pos, const TooN::Vector< 2 > &direction) const
Get the component of the motion of a point in the direction provided with respect to each of the inte...
Definition: camera.h:72
TooN::Vector< 2 > project(const TooN::Vector< 2 > &camframe) const
Project from Euclidean camera frame to image plane.
Definition: camera.h:296
TooN::Matrix< 2, 2 > get_derivative_at(const TooN::Vector< 2 > &) const
Get the derivative of image frame wrt camera frame at the last computed projection in the form ...
Definition: camera.h:796
TooN::Vector< 2 > project(const TooN::Vector< 2 > &camframe) const
Project from Euclidean camera frame to image plane.
Definition: camera.h:594
void save(std::ostream &os) const
Save parameters to a stream.
Definition: camera.h:427
TooN::Vector< num_parameters > get_parameter_derivs(const TooN::Vector< 2 > &direction) const
Get the component of the motion of a point in the direction provided with respect to each of the inte...
Definition: camera.h:517
A Camera for lenses which attempt to maintain a constant view angle per pixel.
Definition: camera.h:549
TooN::Vector< num_parameters > get_parameter_derivs(const TooN::Vector< 2 > &pos, const TooN::Vector< 2 > &direction) const
Get the component of the motion of a point in the direction provided with respect to each of the inte...
Definition: camera.h:690
void load(std::istream &is)
Load parameters from a stream.
Definition: camera.h:28
TooN::Vector< 2 > linearproject(const TooN::Vector< 2 > &camframe, TooN::DefaultPrecision scale=1) const
Fast linear projection for working out what's there.
Definition: camera.h:433
TooN::Vector< 2 > linearproject(const TooN::Vector< 2 > &camframe, TooN::DefaultPrecision scale=1) const
Fast linear projection for working out what's there.
Definition: camera.h:860
TooN::Matrix< 2, 2 > get_derivative_at(const TooN::Vector< 2 > &pt) const
Evaluate the derivative of image frame wrt camera frame at an arbitrary point pt. ...
Definition: camera.h:316
A Camera with zero skew and Harris distortion.
Definition: camera.h:261
void save(std::ostream &os) const
Save parameters to a stream.
Definition: camera.h:34
void save(std::ostream &os) const
Save parameters to a stream.
Definition: camera.h:284
void load(std::istream &is)
Load parameters from a stream.
Definition: camera.h:420
TooN::Vector< 2 > project_vector(const TooN::Vector< 2 > &x, const TooN::Vector< 2 > &d) const
Project from Euclidean camera frame to image plane.
Definition: camera.h:180
TooN::Vector< num_parameters > & get_parameters()
Update the internal camera parameters by adding the vector given.
Definition: camera.h:702
TooN::Matrix< num_parameters, 2 > get_parameter_derivs_at(const TooN::Vector< 2 > &pt) const
Evaluate the derivative of the image coordinates of a given point pt in camera coordinates with respe...
Definition: camera.h:647
TooN::Matrix< num_parameters, 2 > get_parameter_derivs() const
Get the motion of a point with respect to each of the internal camera parameters. ...
Definition: camera.h:481
void update(const TooN::Vector< num_parameters > &updates)
Update the internal camera parameters by adding the vector given.
Definition: camera.h:834
A camera with zero skew and cubic distortion.
Definition: camera.h:116
TooN::Matrix< 2, 2 > get_derivative(const TooN::Vector< 2 > &pt) const
Evaluate the derivative of image frame wrt camera frame at an arbitrary point pt. ...
Definition: camera.h:630
A camera with zero skew and quintic distortion.
Definition: camera.h:163
An adapter to make old-style cameras which remember the last projected point.
Definition: camera.h:720
TooN::Matrix< num_parameters, 2 > get_parameter_derivs() const
Get the motion of a point with respect to each of the internal camera parameters. ...
Definition: camera.h:994
const TooN::Vector< num_parameters > & get_parameters() const
Returns the vector of camera parameters in the format .
Definition: camera.h:230
TooN::Matrix< num_parameters, 2 > get_parameter_derivs_at(const TooN::Vector< 2 > &pt) const
Evaluate the derivative of the image coordinates of a given point pt in camera coordinates with respe...
Definition: camera.h:340
TooN::Vector< 2 > linearproject(const TooN::Vector< 2 > &camframe, TooN::DefaultPrecision scale=1) const
Fast linear projection for working out what's there.
Definition: camera.h:766
TooN::Vector< 2 > linearproject(const TooN::Vector< 2 > &camframe, TooN::DefaultPrecision scale) const
Fast linear projection for working out what's there.
Definition: camera.h:40
TooN::Vector< 2 > project(const TooN::Vector< 2 > &camframe) const
Project from Euclidean camera frame to image plane.
Definition: camera.h:45
TooN::Vector< 2 > unproject(const TooN::Vector< 2 > &imframe) const
Project from image plane to a Euclidean camera.
Definition: camera.h:882
TooN::Vector< 2 > project(const TooN::Vector< 2 > &camframe) const
Project from Euclidean camera frame to image plane.
Definition: camera.h:771
TooN::Vector< 2 > unproject(const TooN::Vector< 2 > &imframe) const
Project from image plane to a Euclidean camera.
Definition: camera.h:600
void update(const TooN::Vector< num_parameters > &updates)
Update the internal camera parameters by adding the vector given.
Definition: camera.h:100
TooN::Vector< num_parameters > get_parameter_derivs(const TooN::Vector< 2 > &position, const TooN::Vector< 2 > &direction) const
Get the component of the motion of a point in the direction provided with respect to each of the inte...
Definition: camera.h:377
TooN::Vector< 2 > project(const TooN::Vector< 2 > &camframe) const
Project from Euclidean camera frame to image plane.
Definition: camera.h:439
void load(std::istream &is)
Load parameters from a stream.
Definition: camera.h:850
TooN::Vector< 2 > unproject(const TooN::Vector< 2 > &imframe) const
Project from image plane to a Euclidean camera.
Definition: camera.h:302
void load(std::istream &is)
Load parameters from a stream.
Definition: camera.h:756
TooN::Vector< num_parameters > & get_parameters()
Returns the vector of camera parameters in the format .
Definition: camera.h:154
A linear camera with zero skew.
Definition: camera.h:20