opencv 2.2.0
/usr/src/RPM/BUILD/libopencv2.2-2.2.0/modules/core/include/opencv2/core/eigen.hpp
Go to the documentation of this file.
00001 /*M///////////////////////////////////////////////////////////////////////////////////////
00002 //
00003 //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
00004 //
00005 //  By downloading, copying, installing or using the software you agree to this license.
00006 //  If you do not agree to this license, do not download, install,
00007 //  copy or use the software.
00008 //
00009 //
00010 //                          License Agreement
00011 //                For Open Source Computer Vision Library
00012 //
00013 // Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
00014 // Copyright (C) 2009, Willow Garage Inc., all rights reserved.
00015 // Third party copyrights are property of their respective owners.
00016 //
00017 // Redistribution and use in source and binary forms, with or without modification,
00018 // are permitted provided that the following conditions are met:
00019 //
00020 //   * Redistribution's of source code must retain the above copyright notice,
00021 //     this list of conditions and the following disclaimer.
00022 //
00023 //   * Redistribution's in binary form must reproduce the above copyright notice,
00024 //     this list of conditions and the following disclaimer in the documentation
00025 //     and/or other materials provided with the distribution.
00026 //
00027 //   * The name of the copyright holders may not be used to endorse or promote products
00028 //     derived from this software without specific prior written permission.
00029 //
00030 // This software is provided by the copyright holders and contributors "as is" and
00031 // any express or implied warranties, including, but not limited to, the implied
00032 // warranties of merchantability and fitness for a particular purpose are disclaimed.
00033 // In no event shall the Intel Corporation or contributors be liable for any direct,
00034 // indirect, incidental, special, exemplary, or consequential damages
00035 // (including, but not limited to, procurement of substitute goods or services;
00036 // loss of use, data, or profits; or business interruption) however caused
00037 // and on any theory of liability, whether in contract, strict liability,
00038 // or tort (including negligence or otherwise) arising in any way out of
00039 // the use of this software, even if advised of the possibility of such damage.
00040 //
00041 //M*/
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 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines