00001
00020 #ifndef EIGEN_UTILS_H
00021 #define EIGEN_UTILS_H
00022
00023 #include <ntk/core.h>
00024 #include "Eigen/Core"
00025 #include "Eigen/Geometry"
00026
00027 namespace ntk
00028 {
00029
00030 template <typename CvScalarType, typename EScalarType>
00031 inline void toEigen(const cv::Point3_<CvScalarType>& p, Eigen::Matrix<EScalarType,3,1>& ep)
00032 {
00033 ep(0) = p.x;
00034 ep(1) = p.y;
00035 ep(2) = p.z;
00036 }
00037
00038 template <typename CvScalarType, typename EScalarType>
00039 inline void toEigen(const cv::Vec<CvScalarType,3>& p, Eigen::Matrix<EScalarType,3,1>& ep)
00040 {
00041 ep(0) = p[0];
00042 ep(1) = p[1];
00043 ep(2) = p[2];
00044 }
00045
00046 template <typename CvScalarType, typename EScalarType>
00047 inline void toEigen(const cv::Vec<CvScalarType,3>& p, Eigen::Matrix<EScalarType,4,1>& ep)
00048 {
00049 ep(0) = p[0];
00050 ep(1) = p[1];
00051 ep(2) = p[2];
00052 ep(3) = 1;
00053 }
00054
00055 template <typename CvScalarType, typename EScalarType>
00056 inline void toEigen(const cv::Point3_<CvScalarType>& p, Eigen::Matrix<EScalarType,4,1>& ep)
00057 {
00058 ep(0) = p.x;
00059 ep(1) = p.y;
00060 ep(2) = p.z;
00061 ep(3) = 1;
00062 }
00063
00064 template <typename CvScalarType, typename EigenScalarType, int H, int W>
00065 inline void toOpencv(const Eigen::Matrix<EigenScalarType,H,W>& ep,
00066 cv::Mat_<CvScalarType>& mat)
00067 {
00068 for (int r = 0; r < H; ++r)
00069 for (int c = 0; c < W; ++c)
00070 mat(r,c) = ep(r,c);
00071 }
00072
00073 template <typename CvScalarType, typename EScalarType, int H, int W>
00074 inline void toEigen(const cv::Mat_<CvScalarType>& mat, Eigen::Matrix<EScalarType,H,W>& ep)
00075 {
00076 for (int r = 0; r < H; ++r)
00077 for (int c = 0; c < W; ++c)
00078 ep(r,c) = mat(r,c);
00079 }
00080
00081 template <typename EScalarType>
00082 inline cv::Vec3f toVec3f(const Eigen::Matrix<EScalarType,3,1>& v)
00083 {
00084 return cv::Vec3f(v(0),v(1),v(2));
00085 }
00086
00087 template <typename EScalarType>
00088 inline cv::Vec3f toVec3f(const Eigen::Matrix<EScalarType,4,1>& v)
00089 {
00090
00091 return cv::Vec3f(v(0),v(1),v(2));
00092 }
00093
00094 inline Eigen::Vector2d toEigenVector2d(const cv::Point2f& v)
00095 { Eigen::Vector2d r (v.x, v.y); return r; }
00096
00097 inline Eigen::Vector3d toEigenVector3d(const cv::Vec3f& v)
00098 { Eigen::Vector3d r; toEigen(v, r); return r; }
00099
00100 inline Eigen::Vector4d toEigenVector4d(const cv::Vec3f& v)
00101 { Eigen::Vector4d r; toEigen(v, r); return r; }
00102
00103 template<typename _Scalar> class EulerAngles
00104 {
00105 public:
00106 enum { Dim = 3 };
00107 typedef _Scalar Scalar;
00108 typedef Eigen::Matrix<Scalar,3,3> Matrix3;
00109 typedef Eigen::Matrix<Scalar,3,1> Vector3;
00110 typedef Eigen::Quaternion<Scalar> QuaternionType;
00111
00112 protected:
00113
00114 Vector3 m_angles;
00115
00116 public:
00117
00118 EulerAngles() {}
00119 inline EulerAngles(Scalar a0, Scalar a1, Scalar a2) : m_angles(a0, a1, a2) {}
00120 inline EulerAngles(const QuaternionType& q) { *this = q; }
00121
00122 const Vector3& coeffs() const { return m_angles; }
00123 Vector3& coeffs() { return m_angles; }
00124
00125 EulerAngles& operator=(const QuaternionType& q)
00126 {
00127 Matrix3 m = q.toRotationMatrix();
00128 return *this = m;
00129 }
00130
00131 EulerAngles& operator=(const Matrix3& m)
00132 {
00133
00134
00135
00136 m_angles.coeffRef(1) = std::asin(m.coeff(0,2));
00137 m_angles.coeffRef(0) = std::atan2(-m.coeff(1,2),m.coeff(2,2));
00138 m_angles.coeffRef(2) = std::atan2(-m.coeff(0,1),m.coeff(0,0));
00139 return *this;
00140 }
00141
00142 Matrix3 toRotationMatrix(void) const
00143 {
00144 Vector3 c = m_angles.array().cos();
00145 Vector3 s = m_angles.array().sin();
00146 Matrix3 res;
00147 res << c.y()*c.z(), -c.y()*s.z(), s.y(),
00148 c.z()*s.x()*s.y()+c.x()*s.z(), c.x()*c.z()-s.x()*s.y()*s.z(), -c.y()*s.x(),
00149 -c.x()*c.z()*s.y()+s.x()*s.z(), c.z()*s.x()+c.x()*s.y()*s.z(), c.x()*c.y();
00150 return res;
00151 }
00152
00153 operator QuaternionType() { return QuaternionType(toRotationMatrix()); }
00154 };
00155
00156 }
00157
00158 #endif // EIGEN_UTILS_H