LCOV - code coverage report
Current view: top level - improc - eigenImage.hpp (source / functions) Coverage Total Hit
Test: mxlib Lines: 100.0 % 2 2
Test Date: 2026-02-19 16:58:26 Functions: 100.0 % 1 1

            Line data    Source code
       1              : /** \file eigenImage.hpp
       2              :  * \brief Tools for using the eigen library for image processing
       3              :  * \ingroup image_processing_files
       4              :  * \author Jared R. Males (jaredmales@gmail.com)
       5              :  *
       6              :  */
       7              : 
       8              : //***********************************************************************//
       9              : // Copyright 2015, 2016, 2017 Jared R. Males (jaredmales@gmail.com)
      10              : //
      11              : // This file is part of mxlib.
      12              : //
      13              : // mxlib is free software: you can redistribute it and/or modify
      14              : // it under the terms of the GNU General Public License as published by
      15              : // the Free Software Foundation, either version 3 of the License, or
      16              : // (at your option) any later version.
      17              : //
      18              : // mxlib is distributed in the hope that it will be useful,
      19              : // but WITHOUT ANY WARRANTY; without even the implied warranty of
      20              : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      21              : // GNU General Public License for more details.
      22              : //
      23              : // You should have received a copy of the GNU General Public License
      24              : // along with mxlib.  If not, see <http://www.gnu.org/licenses/>.
      25              : //***********************************************************************//
      26              : 
      27              : #ifndef improc_eigenImage_hpp
      28              : #define improc_eigenImage_hpp
      29              : 
      30              : #pragma GCC system_header
      31              : #include <Eigen/Dense>
      32              : 
      33              : #include "../math/vectorUtils.hpp"
      34              : 
      35              : namespace mx
      36              : {
      37              : namespace improc
      38              : {
      39              : 
      40              : /// Definition of the eigenImage type, which is an alias for Eigen::Array.
      41              : /** \ingroup eigen_image_processing
      42              :  */
      43              : template <typename scalarT>
      44              : using eigenImage = Eigen::Array<scalarT, -1, -1>;
      45              : 
      46              : /// Definition of the eigenMap type, which is an alias for Eigen::Map<Array>.
      47              : /** \ingroup eigen_image_processing
      48              :  */
      49              : template <typename scalarT>
      50              : using eigenMap = Eigen::Map<Eigen::Array<scalarT, -1, -1>>;
      51              : 
      52              : /// Test whether a type is an eigenCube by testing whether it has a typedef of "is_eigenCube"
      53              : /** Used for compile-time determination of type
      54              :  * Example usage:
      55              :  * \code
      56              :  * bool is_eC = is_eigenCube<eigenCube<float> >; //Evaluates to true
      57              :  * bool is_not_eC = is_eigenCube<eigenImagef>; //Evaluates to false
      58              :  * \endcode
      59              :  *
      60              :  * This was taken directly from the example at http://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error
      61              :  *
      62              :  * \ingroup eigen_image_processing
      63              :  */
      64              : template <typename T>
      65              : struct is_eigenCube
      66              : {
      67              :     // Types "yes" and "no" are guaranteed to have different sizes,
      68              :     // specifically sizeof(yes) == 1 and sizeof(no) == 2.
      69              :     typedef char yes[1];
      70              :     typedef char no[2];
      71              : 
      72              :     template <typename imageT>
      73              :     static yes &test( typename imageT::is_eigenCube * );
      74              : 
      75              :     template <typename>
      76              :     static no &test( ... );
      77              : 
      78              :     // If the "sizeof" of the result of calling test<T>(0) would be equal to sizeof(yes),
      79              :     // the first overload worked and T has a nested type named "is_eigenCube".
      80              :     static const bool value = sizeof( test<T>( 0 ) ) == sizeof( yes );
      81              : };
      82              : 
      83              : /// Function object to return the number of planes for any Eigen like object, whether 2D or a 3D cube.
      84              : /** Uses SFINAE to check for 3D eigenCube.
      85              :  *
      86              :  * \ingroup eigen_image_processing
      87              :  */
      88              : template <typename arrT, bool isCube = is_eigenCube<arrT>::value>
      89              : struct eigenArrPlanes
      90              : {
      91              :     // If it's an eigenCube, call planes planes()
      92              :     int operator()( const arrT &arr )
      93              :     {
      94              :         return arr.planes();
      95              :     }
      96              : };
      97              : 
      98              : template <typename arrT>
      99              : struct eigenArrPlanes<arrT, false>
     100              : {
     101              :     // If it's not an eigenCube, never call planes()
     102           18 :     int operator()( const arrT &arr )
     103              :     {
     104           18 :         return 1;
     105              :     }
     106              : };
     107              : 
     108              : 
     109              : } // namespace improc
     110              : } // namespace mx
     111              : 
     112              : #endif // improc_eigenImage_hpp
        

Generated by: LCOV version 2.0-1