/**
* @file         opencvutils_utils.hpp
*
* Purpose       Declaration OpenCV utility functions 
*
* Authors       Dinesh Iyer
*
* Copyright     2019-2020 MathWorks, Inc.
*
*/

#ifndef imagesdatatypesopencvutils_header
#define imagesdatatypesopencvutils_header

#include "images/datatypes/Image.hpp"
#include "images/datatypes/ImageDefs.hpp"

#ifdef BUILDING_IMAGESDATATYPESOPENCVUTILS
#include "images/datatypes/opencvutils/opencvutils_util.hpp"
#else
#include "opencvutils_util.hpp"
#endif


// Forward Declaration
namespace cv
{
    class Mat;
}


namespace images
{
    namespace datatypes
    {
        namespace opencvutils
        {
            /**
              * Construct an Image from a cv::Mat instance.
              *
              * cv::Mat does not maintain any notion of the photometric
              * interpretation of the data.
              * Hence, the user must specify this upon construction.
              * The data is always in row-major planar order.
              *
              * @param - srcMatrix - Instance of cv::Mat
              * @param - format - ColorFormat of the image data.
              * @param - isCopyData - Flag to determine if a deep copy of the
                                      underlying data is made when creating the
                                      Image
              * @param - relinquish - YES indicates the instance can give up its
              *                        underlying data buffer without a data copy
              */
 
            IMAGESDATATYPESOPENCVUTILS_API images::datatypes::Image  
                        constructFromCvMat( const cv::Mat& srcMatrix,
                                            images::datatypes::ColorFormat format,
                                            bool isCopyData = true, 
                                            images::datatypes::RelinquishDataUnderlying relinquish = 
                                                    images::datatypes::RelinquishDataUnderlying::NO );
            
                                                         
            /**
              * Create a cv::Mat from an image instance
              *
              * cv::Mat does not maintain any notion of the channel order of the data present.
              * Additionally, it always assumes the data is in row-major interleaved order
              *
              * The conversion assumes the following rules:
              * DATATYPE and NumChannels of the Image determine the datatype
              * and number of channels of cv::Mat
              *
              * If Image has data with Layout other than RowMajorInterleaved,
              * it is transformed into RowMajorInterlaved. If this needs to be done, the isCopyData
              * flag is ignored.
              *
              * However, the color format is not changed i.e.
              * BGR data is not changed into RGB data.
              *
              * @param - im - Instance of Image that needs to be converted
              * @param - isCopyData - Flag to determine if a deep copy of the
                                      underlying data is made when creating the
                                      cv::Mat
              * @return - cv::Mat instance
              */
            IMAGESDATATYPESOPENCVUTILS_API cv::Mat convertToCvMat( const images::datatypes::Image& im,
                                           bool isCopyData = true );
        }
    }
}

#endif  // imagesdatatypesopencvutils_header