27#ifndef improc_milkImage_hpp
28#define improc_milkImage_hpp
36#include <ImageStreamIO/ImageStreamIO.h>
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 );
410 const timespec &creationtime()
const;
416 const timespec &lastaccesstime()
const;
422 const timespec &atime()
const;
428 const timespec &writetime()
const;
434 const uint64_t &cnt0()
const;
437template <
typename dataT>
438milkImage<dataT>::milkImage()
442template <
typename dataT>
443milkImage<dataT>::milkImage(
const std::string &imname )
448template <
typename dataT>
449milkImage<dataT>::milkImage(
const std::string &imname,
const eigenImage<dataT> &im )
451 create( imname, im );
454template <
typename dataT>
455milkImage<dataT>::milkImage(
const std::string &imname, uint32_t sz0, uint32_t sz1 )
457 create( imname, sz0, sz1 );
460template <
typename dataT>
461milkImage<dataT>::~milkImage()
466template <
typename dataT>
467void milkImage<dataT>::open(
const std::string &imname )
471 ImageStreamIO_closeIm( m_image );
484 errno_t rv = ImageStreamIO_openIm( m_image, imname.c_str() );
486 if( rv != IMAGESTREAMIO_SUCCESS )
493 if( ImageStructTypeCode<dataT>::TypeCode != m_image->md->datatype )
501 m_raw = (dataT *)m_image->array.raw;
502 m_size_0 = m_image->md->size[0];
503 m_size_1 = m_image->md->size[1];
508template <
typename dataT>
509void milkImage<dataT>::create(
const std::string &imname, uint32_t sz0, uint32_t sz1 )
513 ImageStreamIO_closeIm( m_image );
531 errno_t rv = ImageStreamIO_createIm_gpu( m_image,
535 ImageStructTypeCode<dataT>::TypeCode,
540 CIRCULAR_BUFFER | ZAXIS_TEMPORAL,
543 if( rv != IMAGESTREAMIO_SUCCESS )
550 m_image->md->cnt1 = 0;
552 if( ImageStructTypeCode<dataT>::TypeCode != m_image->md->datatype )
560 m_raw = (dataT *)m_image->array.raw;
561 m_size_0 = m_image->md->size[0];
562 m_size_1 = m_image->md->size[1];
567template <
typename dataT>
568void milkImage<dataT>::create(
const std::string &imname,
const eigenImage<dataT> &im )
570 create( imname, im.rows(), im.cols() );
574template <
typename dataT>
577 if( m_map ==
nullptr )
585template <
typename dataT>
588 if( m_map ==
nullptr )
596template <
typename dataT>
602template <
typename dataT>
603void milkImage<dataT>::reopen()
609template <
typename dataT>
610void milkImage<dataT>::close()
612 if( m_map !=
nullptr )
618 if( m_image ==
nullptr )
623 errno_t rv = ImageStreamIO_closeIm( m_image );
627 if( rv != IMAGESTREAMIO_SUCCESS )
633template <
typename dataT>
634dataT *milkImage<dataT>::data()
639template <
typename dataT>
640const dataT *milkImage<dataT>::data()
const
645template <
typename dataT>
646uint32_t milkImage<dataT>::rows()
const
651template <
typename dataT>
652uint32_t milkImage<dataT>::cols()
const
657template <
typename dataT>
658uint32_t milkImage<dataT>::size(
unsigned n )
const
672template <
typename dataT>
673uint64_t milkImage<dataT>::size()
const
675 return m_size_0 * m_size_1;
678template <
typename dataT>
679void milkImage<dataT>::passive(
bool pass )
684template <
typename dataT>
685bool milkImage<dataT>::passive()
const
690template <
typename dataT>
691bool milkImage<dataT>::valid()
const
693 if( m_image ==
nullptr )
698 if( m_raw != (dataT *)m_image->array.raw || m_size_0 != m_image->md->size[0] || m_size_1 != m_image->md->size[1] ||
699 ImageStructTypeCode<dataT>::TypeCode != m_image->md->datatype )
707template <
typename dataT>
708milkImage<dataT> &milkImage<dataT>::operator=(
const milkImage<dataT> &im )
710 if( m_image ==
nullptr )
715 if( m_map ==
nullptr )
731template <
typename dataT>
732template <
typename eigenT>
733milkImage<dataT> &milkImage<dataT>::operator=(
const eigenT &im )
735 if( m_image ==
nullptr )
740 if( m_map ==
nullptr )
754template <
typename dataT>
755dataT &milkImage<dataT>::operator[](
size_t idx )
760template <
typename dataT>
761const dataT &milkImage<dataT>::operator[](
size_t idx )
const
766template <
typename dataT>
767dataT &milkImage<dataT>::operator()(
int row,
int col )
769 return ( *m_map )( row, col );
772template <
typename dataT>
773const dataT &milkImage<dataT>::operator()(
int row,
int col )
const
775 return ( *m_map )( row, col );
778template <
typename dataT>
779void milkImage<dataT>::setWrite(
bool wrflag )
781 if( m_image ==
nullptr )
786 m_image->md->write = wrflag;
789template <
typename dataT>
790void milkImage<dataT>::post()
792 if( m_image ==
nullptr )
799 errno_t rv = ImageStreamIO_UpdateIm( m_image );
800 m_image->md->atime = m_image->md->writetime;
802 if( rv != IMAGESTREAMIO_SUCCESS )
809 if( clock_gettime( CLOCK_ISIO, &m_image->md->writetime ) == -1 )
813 m_image->md->atime = m_image->md->writetime;
815 m_image->md->write = 0;
816 ImageStreamIO_sempost( m_image, -1 );
820template <
typename dataT>
821const timespec &milkImage<dataT>::creationtime()
const
823 return m_image->md->creationtime;
826template <
typename dataT>
827const timespec &milkImage<dataT>::lastaccesstime()
const
829 return m_image->md->lastaccesstime;
832template <
typename dataT>
833const timespec &milkImage<dataT>::atime()
const
835 return m_image->md->atime;
838template <
typename dataT>
839const timespec &milkImage<dataT>::writetime()
const
841 return m_image->md->writetime;
844template <
typename dataT>
845const uint64_t &milkImage<dataT>::cnt0()
const
847 return m_image->md->cnt0;
Tools for using the eigen library for image processing.
Eigen::Array< scalarT, -1, -1 > eigenImage
Definition of the eigenImage type, which is an alias for Eigen::Array.
Eigen::Map< Eigen::Array< scalarT, -1, -1 > > eigenMap
Definition of the eigenMap type, which is an alias for Eigen::Map<Array>.
static constexpr error_t errno2error_t(const int &err)
Convert an errno code to error_t.
@ exception
An exception was thrown.
@ invalidconfig
A config setting was invalid.
@ invalidarg
An argument was invalid.
@ liberr
An error was returned by a library.
Declarations of some libarary wide utilities.