27#ifndef improc_milkImage_hpp
28#define improc_milkImage_hpp
36#include <ImageStreamIO/ImageStreamIO.h>
38#include "../mxException.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};
174 const std::string &imname );
177 milkImage(
const std::string &imname,
183 milkImage(
const std::string &imname,
184 const eigenImage<dataT> &im
195 open(
const std::string &imname );
201 void create(
const std::string &imname,
211 void create(
const std::string &imname,
212 const eigenImage<dataT> &im
231 uint32_t size(
unsigned n );
237 void passive(
bool pass );
278 eigenMap<dataT> &operator()();
296 operator eigenMap<dataT>();
304 template <
typename eigenT>
305 milkImage &operator=(
const eigenT &im );
313 void setWrite(
bool wrflag =
true );
324template <
typename dataT>
325milkImage<dataT>::milkImage()
329template <
typename dataT>
330milkImage<dataT>::milkImage(
const std::string &imname )
335template <
typename dataT>
336milkImage<dataT>::milkImage(
const std::string &imname,
const eigenImage<dataT> &im )
338 create( imname, im );
341template <
typename dataT>
342milkImage<dataT>::milkImage(
const std::string &imname, uint32_t sz0, uint32_t sz1 )
344 create( imname, sz0, sz1 );
347template <
typename dataT>
348milkImage<dataT>::~milkImage()
353template <
typename dataT>
354void milkImage<dataT>::open(
const std::string &imname )
358 ImageStreamIO_closeIm( m_image );
371 errno_t rv = ImageStreamIO_openIm( m_image, imname.c_str() );
373 if( rv != IMAGESTREAMIO_SUCCESS )
377 throw err::mxException(
"", 0,
"", 0,
"", 0,
"ImageStreamIO_openIm returned an error" );
380 if( ImageStructTypeCode<dataT>::TypeCode != m_image->md->datatype )
384 throw std::invalid_argument(
"shmim datatype does not match template type" );
388 m_raw = (dataT *)m_image->array.raw;
389 m_size_0 = m_image->md->size[0];
390 m_size_1 = m_image->md->size[1];
392 m_map =
new eigenMap<dataT>( m_raw, m_size_0, m_size_1 );
395template <
typename dataT>
396void milkImage<dataT>::create(
const std::string &imname, uint32_t sz0, uint32_t sz1 )
400 ImageStreamIO_closeIm( m_image );
418 errno_t rv = ImageStreamIO_createIm_gpu( m_image,
422 ImageStructTypeCode<dataT>::TypeCode,
427 CIRCULAR_BUFFER | ZAXIS_TEMPORAL,
430 if( rv != IMAGESTREAMIO_SUCCESS )
434 throw err::mxException(
"", 0,
"", 0,
"", 0,
"ImageStreamIO_createIm_gpu returned an error" );
437 if( ImageStructTypeCode<dataT>::TypeCode != m_image->md->datatype )
441 throw std::invalid_argument(
"shmim datatype does not match template type" );
445 m_raw = (dataT *)m_image->array.raw;
446 m_size_0 = m_image->md->size[0];
447 m_size_1 = m_image->md->size[1];
449 m_map =
new eigenMap<dataT>( m_raw, m_size_0, m_size_1 );
452template <
typename dataT>
453void milkImage<dataT>::create(
const std::string &imname,
const eigenImage<dataT> &im )
455 create( imname, im.rows(), im.cols() );
459template <
typename dataT>
460eigenMap<dataT> &milkImage<dataT>::operator()()
462 if( m_map ==
nullptr )
464 throw err::mxException(
"", 0,
"", 0,
"", 0,
"Image is not open (map is null)" );
470template <
typename dataT>
471milkImage<dataT>::operator eigenMap<dataT>()
476template <
typename dataT>
477void milkImage<dataT>::reopen()
483template <
typename dataT>
484void milkImage<dataT>::close()
486 if( m_map !=
nullptr )
492 if( m_image ==
nullptr )
497 errno_t rv = ImageStreamIO_closeIm( m_image );
501 if( rv != IMAGESTREAMIO_SUCCESS )
502 throw err::mxException(
"", 0,
"", 0,
"", 0,
"ImageStreamIO_closeIm returned an error" );
505template <
typename dataT>
506uint32_t milkImage<dataT>::rows()
511template <
typename dataT>
512uint32_t milkImage<dataT>::cols()
517template <
typename dataT>
518uint32_t milkImage<dataT>::size(
unsigned n )
532template <
typename dataT>
533void milkImage<dataT>::passive(
bool pass)
538template <
typename dataT>
539bool milkImage<dataT>::passive()
544template <
typename dataT>
545bool milkImage<dataT>::valid()
547 if( m_image ==
nullptr )
552 if( m_raw != (dataT *)m_image->array.raw || m_size_0 != m_image->md->size[0] || m_size_1 != m_image->md->size[1] ||
553 ImageStructTypeCode<dataT>::TypeCode != m_image->md->datatype )
561template <
typename dataT>
562template <
typename eigenT>
563milkImage<dataT> &milkImage<dataT>::operator=(
const eigenT &im )
565 if( m_image ==
nullptr )
567 throw err::mxException(
"", 0,
"", 0,
"", 0,
"Image is not open (image is null)" );
570 if( m_map ==
nullptr )
572 throw err::mxException(
"", 0,
"", 0,
"", 0,
"Image is not open (map is null)" );
586template <
typename dataT>
587void milkImage<dataT>::setWrite(
bool wrflag )
589 if( m_image ==
nullptr )
591 throw err::mxException(
"", 0,
"", 0,
"", 0,
"Image is not open" );
594 m_image->md->write = wrflag;
597template <
typename dataT>
598void milkImage<dataT>::post()
600 if( m_image ==
nullptr )
602 throw err::mxException(
"", 0,
"", 0,
"", 0,
"Image is not open" );
607 errno_t rv = ImageStreamIO_UpdateIm( m_image );
608 m_image->md->atime = m_image->md->writetime;
610 if( rv != IMAGESTREAMIO_SUCCESS )
612 throw err::mxException(
"", 0,
"", 0,
"", 0,
"ImageStreamIO_UpdateIm returned an error" );
617 if(clock_gettime(CLOCK_ISIO, &m_image->md->writetime) == -1)
619 throw err::mxException(
"", 0,
"", 0,
"", 0,
"clock_gettime returned an error" );
621 m_image->md->atime = m_image->md->writetime;
623 m_image->md->write = 0;
624 ImageStreamIO_sempost( m_image, -1 );
Tools for using the eigen library for image processing.