27#ifndef improc_milkImage_hpp
28#define improc_milkImage_hpp
36#include <ImageStreamIO/ImageStreamIO.h>
38#include "../mxlib.hpp"
46template <
typename typeT>
47struct ImageStructTypeCode;
50struct ImageStructTypeCode<uint8_t>
52 constexpr static int TypeCode = _DATATYPE_UINT8;
56struct ImageStructTypeCode<int8_t>
58 constexpr static int TypeCode = _DATATYPE_INT8;
62struct ImageStructTypeCode<char>
64 constexpr static int TypeCode = _DATATYPE_INT8;
68struct ImageStructTypeCode<uint16_t>
70 constexpr static int TypeCode = _DATATYPE_UINT16;
74struct ImageStructTypeCode<int16_t>
76 constexpr static int TypeCode = _DATATYPE_INT16;
80struct ImageStructTypeCode<uint32_t>
82 constexpr static int TypeCode = _DATATYPE_UINT32;
86struct ImageStructTypeCode<int32_t>
88 constexpr static int TypeCode = _DATATYPE_INT32;
92struct ImageStructTypeCode<uint64_t>
94 constexpr static int TypeCode = _DATATYPE_UINT64;
97struct ImageStructTypeCode<int64_t>
99 constexpr static int TypeCode = _DATATYPE_INT64;
102struct ImageStructTypeCode<float>
104 constexpr static int TypeCode = _DATATYPE_FLOAT;
108struct ImageStructTypeCode<double>
110 constexpr static int TypeCode = _DATATYPE_DOUBLE;
114struct ImageStructTypeCode<std::complex<float>>
116 constexpr static int TypeCode = _DATATYPE_COMPLEX_FLOAT;
120struct ImageStructTypeCode<std::complex<double>>
122 constexpr static int TypeCode = _DATATYPE_COMPLEX_DOUBLE;
145template <
typename _dataT>
149 typedef _dataT dataT;
154 IMAGE *m_image{
nullptr };
156 dataT *m_raw{
nullptr };
158 eigenMap<dataT> *m_map{
nullptr };
160 uint64_t m_size_0{ 0 };
162 uint64_t m_size_1{ 0 };
164 bool m_passive{
false };
173 milkImage(
const std::string &imname
178 milkImage(
const std::string &imname,
184 milkImage(
const std::string &imname,
185 const eigenImage<dataT> &im
195 void open(
const std::string &imname
203 void create(
const std::string &imname,
213 void create(
const std::string &imname,
214 const eigenImage<dataT> &im
221 const dataT *data()
const;
227 uint32_t rows()
const;
233 uint32_t cols()
const;
239 uint64_t size()
const;
245 uint32_t size(
unsigned n )
const;
251 void passive(
bool pass );
257 bool passive()
const;
292 eigenMap<dataT> &operator()();
305 const eigenMap<dataT> &operator()()
const;
323 operator eigenMap<dataT>();
331 milkImage &operator=(
const milkImage &im );
339 template <
typename eigenT>
340 milkImage &operator=(
const eigenT &im );
351 dataT &operator[](
size_t idx );
362 const dataT &operator[](
size_t idx )
const;
373 dataT &operator()(
int row,
386 const dataT &operator()(
int row,
396 void setWrite(
bool wrflag =
true );
413template <
typename dataT>
414milkImage<dataT>::milkImage()
418template <
typename dataT>
419milkImage<dataT>::milkImage(
const std::string &imname )
424template <
typename dataT>
425milkImage<dataT>::milkImage(
const std::string &imname,
const eigenImage<dataT> &im )
427 create( imname, im );
430template <
typename dataT>
431milkImage<dataT>::milkImage(
const std::string &imname, uint32_t sz0, uint32_t sz1 )
433 create( imname, sz0, sz1 );
436template <
typename dataT>
437milkImage<dataT>::~milkImage()
442template <
typename dataT>
443void milkImage<dataT>::open(
const std::string &imname )
447 ImageStreamIO_closeIm( m_image );
460 errno_t rv = ImageStreamIO_openIm( m_image, imname.c_str() );
462 if( rv != IMAGESTREAMIO_SUCCESS )
469 if( ImageStructTypeCode<dataT>::TypeCode != m_image->md->datatype )
477 m_raw = (dataT *)m_image->array.raw;
478 m_size_0 = m_image->md->size[0];
479 m_size_1 = m_image->md->size[1];
481 m_map =
new eigenMap<dataT>( m_raw, m_size_0, m_size_1 );
484template <
typename dataT>
485void milkImage<dataT>::create(
const std::string &imname, uint32_t sz0, uint32_t sz1 )
489 ImageStreamIO_closeIm( m_image );
507 errno_t rv = ImageStreamIO_createIm_gpu( m_image,
511 ImageStructTypeCode<dataT>::TypeCode,
516 CIRCULAR_BUFFER | ZAXIS_TEMPORAL,
519 if( rv != IMAGESTREAMIO_SUCCESS )
526 if( ImageStructTypeCode<dataT>::TypeCode != m_image->md->datatype )
534 m_raw = (dataT *)m_image->array.raw;
535 m_size_0 = m_image->md->size[0];
536 m_size_1 = m_image->md->size[1];
538 m_map =
new eigenMap<dataT>( m_raw, m_size_0, m_size_1 );
541template <
typename dataT>
542void milkImage<dataT>::create(
const std::string &imname,
const eigenImage<dataT> &im )
544 create( imname, im.rows(), im.cols() );
548template <
typename dataT>
549eigenMap<dataT> &milkImage<dataT>::operator()()
551 if( m_map ==
nullptr )
559template <
typename dataT>
560const eigenMap<dataT> &milkImage<dataT>::operator()()
const
562 if( m_map ==
nullptr )
570template <
typename dataT>
571milkImage<dataT>::operator eigenMap<dataT>()
576template <
typename dataT>
577void milkImage<dataT>::reopen()
583template <
typename dataT>
584void milkImage<dataT>::close()
586 if( m_map !=
nullptr )
592 if( m_image ==
nullptr )
597 errno_t rv = ImageStreamIO_closeIm( m_image );
601 if( rv != IMAGESTREAMIO_SUCCESS )
607template <
typename dataT>
608dataT *milkImage<dataT>::data()
613template <
typename dataT>
614const dataT *milkImage<dataT>::data()
const
619template <
typename dataT>
620uint32_t milkImage<dataT>::rows()
const
625template <
typename dataT>
626uint32_t milkImage<dataT>::cols()
const
631template <
typename dataT>
632uint32_t milkImage<dataT>::size(
unsigned n )
const
646template <
typename dataT>
647uint64_t milkImage<dataT>::size()
const
649 return m_size_0 * m_size_1;
652template <
typename dataT>
653void milkImage<dataT>::passive(
bool pass )
658template <
typename dataT>
659bool milkImage<dataT>::passive()
const
664template <
typename dataT>
665bool milkImage<dataT>::valid()
const
667 if( m_image ==
nullptr )
672 if( m_raw != (dataT *)m_image->array.raw || m_size_0 != m_image->md->size[0] || m_size_1 != m_image->md->size[1] ||
673 ImageStructTypeCode<dataT>::TypeCode != m_image->md->datatype )
681template <
typename dataT>
682milkImage<dataT> &milkImage<dataT>::operator=(
const milkImage<dataT> &im )
684 if( m_image ==
nullptr )
689 if( m_map ==
nullptr )
705template <
typename dataT>
706template <
typename eigenT>
707milkImage<dataT> &milkImage<dataT>::operator=(
const eigenT &im )
709 if( m_image ==
nullptr )
714 if( m_map ==
nullptr )
728template <
typename dataT>
729dataT &milkImage<dataT>::operator[](
size_t idx )
734template <
typename dataT>
735const dataT &milkImage<dataT>::operator[](
size_t idx )
const
740template <
typename dataT>
741dataT &milkImage<dataT>::operator()(
int row,
int col )
743 return ( *m_map )( row, col );
746template <
typename dataT>
747const dataT &milkImage<dataT>::operator()(
int row,
int col )
const
749 return ( *m_map )( row, col );
752template <
typename dataT>
753void milkImage<dataT>::setWrite(
bool wrflag )
755 if( m_image ==
nullptr )
760 m_image->md->write = wrflag;
763template <
typename dataT>
764void milkImage<dataT>::post()
766 if( m_image ==
nullptr )
773 errno_t rv = ImageStreamIO_UpdateIm( m_image );
774 m_image->md->atime = m_image->md->writetime;
776 if( rv != IMAGESTREAMIO_SUCCESS )
783 if( clock_gettime( CLOCK_ISIO, &m_image->md->writetime ) == -1 )
787 m_image->md->atime = m_image->md->writetime;
789 m_image->md->write = 0;
790 ImageStreamIO_sempost( m_image, -1 );
794template <
typename dataT>
795uint64_t milkImage<dataT>::cnt0()
797 return m_image->md->cnt0;
Augments an exception with the source file and line.
Tools for using the eigen library for image processing.
static constexpr error_t errno2error_t(const int &err)
Convert an errno code to error_t.
@ invalidconfig
A config setting was invalid.
@ invalidarg
An argument was invalid.
@ liberr
An error was returned by a library.