00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #ifndef __OPENCV_CORE_EIGEN_HPP__
00044 #define __OPENCV_CORE_EIGEN_HPP__
00045
00046 #ifdef __cplusplus
00047
00048 #include "cxcore.h"
00049
00050 namespace cv
00051 {
00052
00053 template<typename _Tp, int _rows, int _cols, int _options, int _maxRows, int _maxCols>
00054 void eigen2cv( const Eigen::Matrix<_Tp, _rows, _cols, _options, _maxRows, _maxCols>& src, Mat& dst )
00055 {
00056 if( !(src.Flags & Eigen::RowMajorBit) )
00057 {
00058 Mat _src(src.cols(), src.rows(), DataType<_Tp>::type,
00059 (void*)src.data(), src.stride()*sizeof(_Tp));
00060 transpose(_src, dst);
00061 }
00062 else
00063 {
00064 Mat _src(src.rows(), src.cols(), DataType<_Tp>::type,
00065 (void*)src.data(), src.stride()*sizeof(_Tp));
00066 _src.copyTo(dst);
00067 }
00068 }
00069
00070 template<typename _Tp, int _rows, int _cols, int _options, int _maxRows, int _maxCols>
00071 void cv2eigen( const Mat& src,
00072 Eigen::Matrix<_Tp, _rows, _cols, _options, _maxRows, _maxCols>& dst )
00073 {
00074 CV_DbgAssert(src.rows == _rows && src.cols == _cols);
00075 if( !(dst.Flags & Eigen::RowMajorBit) )
00076 {
00077 Mat _dst(src.cols, src.rows, DataType<_Tp>::type,
00078 dst.data(), (size_t)(dst.stride()*sizeof(_Tp)));
00079 if( src.type() == _dst.type() )
00080 transpose(src, _dst);
00081 else if( src.cols == src.rows )
00082 {
00083 src.convertTo(_dst, _dst.type());
00084 transpose(_dst, _dst);
00085 }
00086 else
00087 Mat(src.t()).convertTo(_dst, _dst.type());
00088 CV_DbgAssert(_dst.data == (uchar*)dst.data());
00089 }
00090 else
00091 {
00092 Mat _dst(src.rows, src.cols, DataType<_Tp>::type,
00093 dst.data(), (size_t)(dst.stride()*sizeof(_Tp)));
00094 src.convertTo(_dst, _dst.type());
00095 CV_DbgAssert(_dst.data == (uchar*)dst.data());
00096 }
00097 }
00098
00099 template<typename _Tp>
00100 void cv2eigen( const Mat& src,
00101 Eigen::Matrix<_Tp, Eigen::Dynamic, Eigen::Dynamic>& dst )
00102 {
00103 dst.resize(src.rows, src.cols);
00104 if( !(dst.Flags & Eigen::RowMajorBit) )
00105 {
00106 Mat _dst(src.cols, src.rows, DataType<_Tp>::type,
00107 dst.data(), (size_t)(dst.stride()*sizeof(_Tp)));
00108 if( src.type() == _dst.type() )
00109 transpose(src, _dst);
00110 else if( src.cols == src.rows )
00111 {
00112 src.convertTo(_dst, _dst.type());
00113 transpose(_dst, _dst);
00114 }
00115 else
00116 Mat(src.t()).convertTo(_dst, _dst.type());
00117 CV_DbgAssert(_dst.data == (uchar*)dst.data());
00118 }
00119 else
00120 {
00121 Mat _dst(src.rows, src.cols, DataType<_Tp>::type,
00122 dst.data(), (size_t)(dst.stride()*sizeof(_Tp)));
00123 src.convertTo(_dst, _dst.type());
00124 CV_DbgAssert(_dst.data == (uchar*)dst.data());
00125 }
00126 }
00127
00128
00129 template<typename _Tp>
00130 void cv2eigen( const Mat& src,
00131 Eigen::Matrix<_Tp, Eigen::Dynamic, 1>& dst )
00132 {
00133 CV_Assert(src.cols == 1);
00134 dst.resize(src.rows);
00135
00136 if( !(dst.Flags & Eigen::RowMajorBit) )
00137 {
00138 Mat _dst(src.cols, src.rows, DataType<_Tp>::type,
00139 dst.data(), (size_t)(dst.stride()*sizeof(_Tp)));
00140 if( src.type() == _dst.type() )
00141 transpose(src, _dst);
00142 else
00143 Mat(src.t()).convertTo(_dst, _dst.type());
00144 CV_DbgAssert(_dst.data == (uchar*)dst.data());
00145 }
00146 else
00147 {
00148 Mat _dst(src.rows, src.cols, DataType<_Tp>::type,
00149 dst.data(), (size_t)(dst.stride()*sizeof(_Tp)));
00150 src.convertTo(_dst, _dst.type());
00151 CV_DbgAssert(_dst.data == (uchar*)dst.data());
00152 }
00153 }
00154
00155
00156 template<typename _Tp>
00157 void cv2eigen( const Mat& src,
00158 Eigen::Matrix<_Tp, 1, Eigen::Dynamic>& dst )
00159 {
00160 CV_Assert(src.rows == 1);
00161 dst.resize(src.cols);
00162 if( !(dst.Flags & Eigen::RowMajorBit) )
00163 {
00164 Mat _dst(src.cols, src.rows, DataType<_Tp>::type,
00165 dst.data(), (size_t)(dst.stride()*sizeof(_Tp)));
00166 if( src.type() == _dst.type() )
00167 transpose(src, _dst);
00168 else
00169 Mat(src.t()).convertTo(_dst, _dst.type());
00170 CV_DbgAssert(_dst.data == (uchar*)dst.data());
00171 }
00172 else
00173 {
00174 Mat _dst(src.rows, src.cols, DataType<_Tp>::type,
00175 dst.data(), (size_t)(dst.stride()*sizeof(_Tp)));
00176 src.convertTo(_dst, _dst.type());
00177 CV_DbgAssert(_dst.data == (uchar*)dst.data());
00178 }
00179 }
00180
00181 }
00182
00183 #endif
00184
00185 #endif
00186