Basic Image AlgorithmS Library  2.8.0
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
OpenEXRInterface.cpp
1 /*
2  This file is part of the BIAS library (Basic ImageAlgorithmS).
3 
4  Copyright (C) 2003-2009 (see file CONTACT for details)
5  Multimediale Systeme der Informationsverarbeitung
6  Institut fuer Informatik
7  Christian-Albrechts-Universitaet Kiel
8 
9 
10  BIAS is free software; you can redistribute it and/or modify
11  it under the terms of the GNU Lesser General Public License as published by
12  the Free Software Foundation; either version 2.1 of the License, or
13  (at your option) any later version.
14 
15  BIAS is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  GNU Lesser General Public License for more details.
19 
20  You should have received a copy of the GNU Lesser General Public License
21  along with BIAS; if not, write to the Free Software
22  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23  */
24 
25 #include "OpenEXRInterface.hh"
26 
27 #ifdef BIAS_HAVE_OPENEXR
28 # ifdef WIN32
29 # pragma warning( push, 1)
30 # define PLATFORM_WINDOWS
31 # endif // WIN32
32 # include <half.h>
33 # include <ImfRgbaFile.h>
34 # include <ImfRgba.h>
35 # include <ImfArray.h>
36 # include <ImathBox.h>
37 # include <ImfInputFile.h>
38 # include <ImfOutputFile.h>
39 # include <ImfChannelList.h>
40 # include <ImfPixelType.h>
41 # include <ImfStringAttribute.h>
42 # ifdef WIN32
43 # pragma warning( pop)
44 # endif // WIN32
45 #endif
46 
47 
48 
49 using namespace BIAS;
50 using namespace Imf;
51 using namespace Imath;
52 using namespace std;
53 
55 OpenEXRInterface() : useOverridePT_(false)
56 {}
57 
60 {
62 }
63 
64 int OpenEXRInterface::Export(const std::string& FileName,
65  const ImageBase& input,
66  const Imf::Compression& compression)
67 {
68  try{
71 
72  int exrwidth = input.GetWidth();
73  int exrheight = input.GetHeight();
74 
75  Header outHeader(exrwidth, exrheight);
76  outHeader.compression() = compression;
77 
78  stringstream sstr;
79  BIASASSERT(input.GetMetaData() != NULL);
80  input.GetMetaData()->WriteAscii(sstr);
81  outHeader.insert("BIASMetaData", StringAttribute(sstr.str().c_str()));
82 
83  stringstream sstrCM;
84  sstrCM << cm;
85  outHeader.insert("BIASColorModel", StringAttribute(sstrCM.str().c_str()));
86 
87  stringstream sstrST;
88  sstrST << st;
89  outHeader.insert("BIASStorageType", StringAttribute(sstrST.str().c_str()));
90 
91 
92  FrameBuffer fb;
93 
94  AddChannels_(cm, st, outHeader, fb, input);
95 
96 
97  OutputFile outFile(FileName.c_str(), outHeader);
98  outFile.setFrameBuffer(fb);
99  outFile.writePixels(exrheight);
100  } catch (Iex::BaseExc &error_ )
101  {
102  BIASERR("Writing "<<FileName<<" with OpenEXR failed."<<endl
103  <<" Caught exception: "<<endl
104  <<" "<<error_.what()<<endl
105  );
106  return -2; // error
107  }
108 
109 
110  return 0;
111 }
112 
113 
115 {
116  if(useOverridePT_)
117  return overridePT_;
118 
119  PixelType pt = Imf::FLOAT;
120  switch(st) {
122  pt = Imf::HALF;
123  break;
124 #ifdef BUILD_IMAGE_UINT
126  pt = Imf::UINT;
127  break;
128 #endif
129 
130  default:
131  break;
132  }
133  return pt;
134 }
135 
137 OpenEXRInterface::MapPixelType_(const Imf::PixelType& pt, const string& storageTypeString)
138 {
140 
141 #ifdef BUILD_IMAGE_UINT
142  if(pt == Imf::UINT) st = ImageBase::ST_unsignedint;
143 #endif
144  if(!storageTypeString.empty()) {
145  ImageBase::EStorageType stFromString;
146  ImageBase::StringToStorageType(storageTypeString, stFromString);
147  if(stFromString!=ImageBase::ST_invalid) st = stFromString;
148  }
149 
150  return st;
151 }
152 
153 /** The order of the channel names in the vector is also the order of channels in the ImageBase representation!
154  * E.G. channelNames[0] = "B", channelNames[1] = "G", channelNames[2] = "R" means that the OpenEXR channel named "B" is assigned
155  * to channel 0 in the ImageBase representation, while channel named "R" is found in ImageBase representation channel=2.
156 **/
158  const unsigned int& numChannels,
159  std::vector<std::string>& channelNames)
160 {
161  channelNames.clear();
162  channelNames.reserve(numChannels);
163  switch(cm) {
164  case ImageBase::CM_invalid:
165  for(unsigned int c=0; c<numChannels; c++) {
166  stringstream sstr;
167  sstr.clear();
168  sstr.str("");
169  sstr<<c;
170  channelNames.push_back(sstr.str());
171  }
172  break;
173  case ImageBase::CM_Grey:
174  channelNames.push_back("Grey"); break;
175  case ImageBase::CM_RGB: channelNames.push_back("R"); channelNames.push_back("G"); channelNames.push_back("B"); break;
176  case ImageBase::CM_BGR: BIASERR("You have data to test this? Please implement!"); return -1; break;
177  case ImageBase::CM_YUYV422: BIASERR("You have data to test this? Please implement!"); return -1; break;
178  case ImageBase::CM_UYVY422: BIASERR("You have data to test this? Please implement!"); return -1; break;
179  case ImageBase::CM_YUV420P: BIASERR("You have data to test this? Please implement!"); return -1; break;
180  case ImageBase::CM_YUV444: BIASERR("You have data to test this? Please implement!"); return -1; break;
181  case ImageBase::CM_YUV411: BIASERR("You have data to test this? Please implement!"); return -1; break;
182  case ImageBase::CM_HSV: BIASERR("You have data to test this? Please implement!"); return -1; break;
183  case ImageBase::CM_HSI_OBS: BIASERR("You have data to test this? Please implement!"); return -1; break;
184  case ImageBase::CM_DV: BIASERR("You have data to test this? Please implement!"); return -1; break;
185  case ImageBase::CM_RGBA:
186  channelNames.push_back("R");
187  channelNames.push_back("G");
188  channelNames.push_back("B");
189  channelNames.push_back("A"); break;
190  case ImageBase::CM_GreyA:
191  channelNames.push_back("Grey");
192  channelNames.push_back("A"); break;
194  channelNames.push_back("Bayer"); break;
196  channelNames.push_back("Bayer"); break;
198  channelNames.push_back("Bayer"); break;
200  channelNames.push_back("Bayer"); break;
201  case ImageBase::CM_HSL: BIASERR("You have data to test this? Please implement!"); return -1; break;
202  case ImageBase::CM_hsL: BIASERR("You have data to test this? Please implement!"); return -1; break;
203  case ImageBase::CM_SymTensor2x2: BIASERR("You have data to test this? Please implement!"); return -1; break;
204  case ImageBase::CM_BGRA: BIASERR("You have data to test this? Please implement!"); break;
205  case ImageBase::CM_RGBE: BIASERR("You have data to test this? Please implement!"); return -1; break;
206  case ImageBase::CM_PGR_XB3_F7M3_GBRG: BIASERR("You have data to test this? Please implement!"); return -1; break;
207  case ImageBase::CM_DepthAndVariance: BIASERR("You have data to test this? Please implement!"); return -1; break;
209  channelNames.push_back("disparity"); break;
210  case ImageBase::CM_Depth:
211  channelNames.push_back("depth"); break;
212  case ImageBase::CM_YUYV: BIASERR("You have data to test this? Please implement!"); return -1; break;
213  case ImageBase::CM_LUV: BIASERR("You have data to test this? Please implement!"); return -1; break;
214  case ImageBase::CM_XYZ: BIASERR("You have data to test this? Please implement!"); return -1; break;
215  case ImageBase::CM_I1I2I3: BIASERR("You have data to test this? Please implement!"); return -1; break;
216  case ImageBase::CM_LAB: BIASERR("You have data to test this? Please implement!"); return -1; break;
217  case ImageBase::CM_DOES_NOT_EXIST: BIASERR("What the heck could have happened?"); return -1; break;
218  }
219  return 0;
220 }
221 
222 
223 
225  const ImageBase::EStorageType& st,
226  Imf::Header& outHeader,
227  Imf::FrameBuffer& fb,
228  const ImageBase& input)
229 {
230 
231  int width = input.GetWidth();
232  int height = input.GetHeight();
233  unsigned int numChannels = input.GetChannelCount();
234 
235  PixelType pt = MapStorageType_(st);
236  vector<string> channelNames;
237  if(GenerateChannelNames_(cm, numChannels, channelNames)!=0) {
238  BIASERR("error");
239  return -1;
240  }
241 
242  for(unsigned int c=0; c<channelNames.size(); c++) {
243  outHeader.channels().insert(channelNames[c].c_str(), Channel(pt));
244 
245  if(AddSlice_(pt, width, height, channelNames[c], fb, c, &input)!=0) {
246  return -1;
247  }
248 
249  }
250 
251  return 0;
252 }
253 
254 int
255 OpenEXRInterface::AddSlice_(Imf::PixelType pt,
256  const int& exrwidth,
257  const int& exrheight,
258  const std::string& channelName,
259  Imf::FrameBuffer& fb,
260  unsigned int channel,
261  const ImageBase* input)
262 {
263 
264  Slice exrSlice;
265  exrSlice.fillValue = 0.0;
266  exrSlice.xSampling = 1;
267  exrSlice.ySampling = 1;
268  // int C = 0;
269  // if(input != NULL)
270  // C = input->GetChannelCount();
271 
272  switch (pt)
273  {
274  case Imf::FLOAT:
275  {
276  float* pixelsFloat = new float[exrwidth * exrheight];
277  channels_[channelName] = pixelsFloat;
278  exrSlice.type = Imf::FLOAT;
279  exrSlice.base = (char*) pixelsFloat;
280  exrSlice.xStride = sizeof(*pixelsFloat) * 1;
281  exrSlice.yStride = sizeof(*pixelsFloat) * exrwidth;
282 
283  if(input!=NULL) {
284  ImageBase::GetChannel<float>(*input, channel, pixelsFloat);
285  }
286  }
287  break;
288  case Imf::HALF:
289  {
290  half* pixelsHalf = new half[exrwidth * exrheight];
291  channels_[channelName] = pixelsHalf;
292  exrSlice.type = Imf::HALF;
293  exrSlice.base = (char*) pixelsHalf;
294  exrSlice.xStride = sizeof(*pixelsHalf) * 1;
295  exrSlice.yStride = sizeof(*pixelsHalf) * exrwidth;
296 
297  if(input!=NULL) {
298  ImageBase::GetChannel(*input, channel, pixelsHalf);
299  }
300  }
301  break;
302 
303  case Imf::UINT:
304 #ifdef BUILD_IMAGE_UINT
305  {
306  unsigned int* pixelsUInt = new unsigned int[exrwidth * exrheight];
307  channels_[channelName] = pixelsUInt;
308  exrSlice.type = Imf::UINT;
309  exrSlice.base = (char*) pixelsUInt;
310  exrSlice.xStride = sizeof(*pixelsUInt) * 1;
311  exrSlice.yStride = sizeof(*pixelsUInt) * exrwidth;
312 
313  if(input!=NULL) {
314  ImageBase::GetChannel(*input, channel, pixelsUInt);
315  }
316  }
317 #else
318  BIASERR("unsigned integer type for ImageBase is not active, find alternative storage type");
319  return -1;
320 #endif
321  break;
322 
323  default:
324  BIASERR("unexpected disp store type!");
325  return -1;
326  }
327 
328 
329 
330  fb.insert(channelName.c_str(), exrSlice);
331 
332  return 0;
333 }
334 
336 {
337  map<string, ChannelData>::iterator it=channels_.begin();
338  for(;it!=channels_.end();it++){
339  it->second.ClearData();
340  }
341  channels_.clear();
342 }
343 
344 
345 int
346 OpenEXRInterface::Import(const std::string& FileName, ImageBase& result)
347 {
348 
349  try
350  {
351 
352  InputFile exrInputFile( FileName.c_str() );
353 
354  Box2i dw = exrInputFile.header().dataWindow();
355  int exrwidth = dw.max.x - dw.min.x + 1;
356  int exrheight = dw.max.y - dw.min.y + 1;
357  if(exrwidth == 0 || exrheight ==0 ) {
358  BIASERR("empty image");
359  return -1;
360  }
361 
362  FrameBuffer fb;
363  unsigned int numChannels = 0;
364  PixelType commonPTType = Imf::UINT;
365  const ChannelList& channels = exrInputFile.header().channels();
366  for(ChannelList::ConstIterator i = channels.begin(); i!= channels.end(); i++) {
367  PixelType ptchannel = i.channel().type;
368  AddSlice_(ptchannel, exrwidth, exrheight, i.name(), fb);
369  if(numChannels==0) {
370  commonPTType = ptchannel;
371  } else {
372  if(ptchannel == Imf::FLOAT) commonPTType = Imf::FLOAT;
373  if(ptchannel == Imf::HALF && commonPTType == Imf::UINT) commonPTType = Imf::FLOAT;
374  if(ptchannel == Imf::UINT && commonPTType == Imf::HALF) commonPTType = Imf::FLOAT;
375  }
376 
377  numChannels++;
378  }
379  if(numChannels==0) {
380  BIASERR("no channels");
381  return -1;
382  }
383 
384  exrInputFile.setFrameBuffer(fb);
385  exrInputFile.readPixels(dw.min.y, dw.max.y);
386 
387  //check if we have a color model
388  vector<string> biasChannelNames;
390  const StringAttribute* colormodel =
391  exrInputFile.header().findTypedAttribute<StringAttribute>("BIASColorModel");
392  if(colormodel != NULL) {
393  ImageBase::StringToColorModel(colormodel->value(), cm);
394  GenerateChannelNames_(cm, numChannels, biasChannelNames);
395  numChannels = biasChannelNames.size();
396  }
397 
398  const StringAttribute* storagetype =
399  exrInputFile.header().findTypedAttribute<StringAttribute>("BIASStorageType");
400  string storagetypestr = "";
401  if(storagetype != NULL) {
402  storagetypestr = storagetype->value();
403  }
404  //extend for stored storage type here:
405  ImageBase::EStorageType st = MapPixelType_(commonPTType, storagetypestr);
406 
407  if(!result.IsEmpty())
408  result.Release();
409  result.Init(exrwidth, exrheight, numChannels, st, true);
410 
411  //read the different channels into the image
412  float* dataFloat = NULL;
413  half* dataHalf = NULL;
414  unsigned int* dataUInt = NULL;
415  if(colormodel != NULL) {
416  for(unsigned int c=0; c<numChannels; c++) {
417  map<string, ChannelData>::const_iterator it = channels_.find(biasChannelNames[c]);
418  if(it == channels_.end()) continue;
419  switch(it->second.Get(dataFloat, dataHalf, dataUInt)) {
420  case ChannelData::empty: continue; break;
421  case ChannelData::isFloat:
422  ImageBase::SetChannel(result, c, dataFloat);
423  break;
424  case ChannelData::isHalf:
425  ImageBase::SetChannel(result, c, dataHalf);
426  break;
427  case ChannelData::isUInt:
428 #ifdef BUILD_IMAGE_UINT
429  ImageBase::SetChannel(result, c, dataUInt);
430 #else
431  BIASERR("unsigned integer type for ImageBase is not active, find alternative storage type");
432  return -1;
433 #endif
434  break;
435  }//end of switch
436  }//end of for each channel
437  } else {
438  unsigned int c=0;
439  for(map<string, ChannelData>::const_iterator it=channels_.begin(); it!=channels_.end(); it++) {
440  switch(it->second.Get(dataFloat, dataHalf, dataUInt)) {
441  case ChannelData::empty: continue; break;
442  case ChannelData::isFloat:
443  ImageBase::SetChannel(result, c, dataFloat);
444  break;
445  case ChannelData::isHalf:
446  ImageBase::SetChannel(result, c, dataHalf);
447  break;
448  case ChannelData::isUInt:
449 #ifdef BUILD_IMAGE_UINT
450  ImageBase::SetChannel(result, c, dataUInt);
451 #else
452  BIASERR("unsigned integer type for ImageBase is not active, find alternative storage type");
453  return -1;
454 #endif
455  break;
456  }//end of switch
457  c++;
458  }//end of for each channel
459  }//end of else BIASColorModel Given
460 
461  if(cm==ImageBase::CM_invalid) {//guess color model if non available
462  if(numChannels==1) cm=ImageBase::CM_Grey;
463  if(numChannels==2) cm=ImageBase::CM_GreyA;
464  if(numChannels==3) cm=ImageBase::CM_RGB;
465  if(numChannels==4) cm=ImageBase::CM_RGBA;
466  }
467  result.SetColorModel(cm);
468  //load meta data
469  const StringAttribute* metadata =
470  exrInputFile.header().findTypedAttribute<StringAttribute>("BIASMetaData");
471  if(metadata != NULL) {
472  stringstream sstr;
473  sstr<<metadata->value();
474  sstr>> *result.GetMetaData();
475  }
476  if(exrInputFile.header().lineOrder() == Imf::DECREASING_Y) result.Flip();
477  }
478 #if defined(BIAS_DEBUG) && defined(ImageIO_DEBUG_IO)
479  catch (Iex::BaseExc &error_ ) {
480  BIASWARN("Reading "<<FileName<<" with OpenEXR failed."<<endl
481  <<" Caught exception: "<<endl
482  <<" "<<error_.what()<<endl
483  );
484 #else
485  catch (Iex::BaseExc &/*error_*/ ) {
486 #endif
487  return -1; // error
488  }
489  catch (...){
490  return -2;
491  }
492 
493 
494  return 0;
495  }
496 
497  void OpenEXRInterface::SetOverridePixelTypeEXR(Imf::PixelType overridePT)
498  {
499  overridePT_ = overridePT;
500  useOverridePT_ = true;
501  }
EColorModel
These are the most often used color models.
Definition: ImageBase.hh:127
std::ostream & WriteAscii(std::ostream &os) const
Writes only the meta datas where AppData::tag==MD_USE_ASCII to os.
Definition: MetaData.cpp:449
YUYV422, 2 channels, full luminance Y, subsampled half U,V.
Definition: ImageBase.hh:133
Bayer_GRBG, 1 channel RGB image Bayer tile.
Definition: ImageBase.hh:145
hsl, similar to HSL but euclidean (h,s) for CNCC
Definition: ImageBase.hh:148
LAB, 3 channels, http://en.wikipedia.org/wiki/Lab_color_space.
Definition: ImageBase.hh:157
static void SetChannel(const ImageBase &im, const unsigned int channelId, const inputType *channelIn)
Copy channel, determines the internal ImageBase type and casts the input type to the type foreseen in...
Definition: ImageBase.hh:340
void SetOverridePixelTypeEXR(Imf::PixelType overridePT)
When exporting image this pixel type is used, not a derived one! Imf::HALF, Imf:FLOAT, Imf::INT are valid values.
int AddSlice_(Imf::PixelType pt, const int &exrwidth, const int &exrheight, const std::string &channelName, Imf::FrameBuffer &fb, unsigned int channel=0, const ImageBase *input=NULL)
HSL, similar to HSV but space is a double tipped cone.
Definition: ImageBase.hh:147
gray values, 1 channel
Definition: ImageBase.hh:130
bool IsEmpty() const
check if ImageData_ points to allocated image buffer or not
Definition: ImageBase.hh:245
DV, color model used for digital video cameras such as Mini-DV.
Definition: ImageBase.hh:140
Othe&#39;s principle component generalization for RGB based segmentation.
Definition: ImageBase.hh:160
YUV411, 2 channles, full luminance, 1 U, 1 V.
Definition: ImageBase.hh:137
Imf::PixelType MapStorageType_(const ImageBase::EStorageType &st)
void SetColorModel(EColorModel Model)
Definition: ImageBase.hh:561
Bayer_RGGB, 1 channel RGB image Bayer tile.
Definition: ImageBase.hh:143
MetaData * GetMetaData()
Definition: ImageBase.hh:456
float image storage type
Definition: ImageBase.hh:118
ImageBase::EStorageType MapPixelType_(const Imf::PixelType &pt, const std::string &storageTypeString="")
XYZ, 3 channels, http://en.wikipedia.org/wiki/Xyz_color_space.
Definition: ImageBase.hh:156
unsigned int GetWidth() const
Definition: ImageBase.hh:312
YUV420P, 2 channels, full luminance Y, 1 U, 1 V. Y, U and V are grouped together for better compressi...
Definition: ImageBase.hh:135
Todo: Conflict with YUVU model, what does it do?
Definition: ImageBase.hh:154
PGR XB3 in format 7 mode 3 delivers an image that consists of 3 channels with 8bbp (overal 24bpp)...
Definition: ImageBase.hh:152
invalid not set image storage type
Definition: ImageBase.hh:111
color values, 3 channels, order: blue,green,red
Definition: ImageBase.hh:132
Bayer_BGGR, 1 channel RGB image Bayer tile.
Definition: ImageBase.hh:146
Disparity images Q: should disp and depth be treated separately, if not what would be a good name to ...
Definition: ImageBase.hh:158
Bayer_GBRG, 1 channel RGB image Bayer tile.
Definition: ImageBase.hh:144
int GetChannel(const ImageBase &source, const unsigned int channel)
copies one specific channel from source to Image can only be called from an planar image...
Definition: ImageBase.cpp:428
CM_YUV444, 3 channels, all channels have full data.
Definition: ImageBase.hh:136
unsigned int GetChannelCount() const
returns the number of Color channels, e.g.
Definition: ImageBase.hh:382
color values, 3 channels, order: red,green,blue
Definition: ImageBase.hh:131
int Import(const std::string &FileName, ImageBase &result)
CIELUV color space, 3 channels, http://en.wikipedia.org/wiki/CIELUV_color_space.
Definition: ImageBase.hh:155
int Export(const std::string &FileName, const ImageBase &input, const Imf::Compression &compression=Imf::ZIP_COMPRESSION)
unsigned int GetHeight() const
Definition: ImageBase.hh:319
static void StringToStorageType(const std::string &str, ImageBase::EStorageType &st)
Definition: ImageBase.cpp:1632
UYVY422, 2 channels, full luminance Y, subsampled half U,V inverse order.
Definition: ImageBase.hh:134
obsolete, HSI is unused and identical to HSL
Definition: ImageBase.hh:139
int AddChannels_(const ImageBase::EColorModel &cm, const ImageBase::EStorageType &st, Imf::Header &outHeader, Imf::FrameBuffer &fb, const ImageBase &input)
SymTensor2x2 The image contains a 2x2 symmetric tensor.
Definition: ImageBase.hh:149
RGBA, 4 channels, order: red,green,blue,alpha.
Definition: ImageBase.hh:141
void Release(const bool reset_storage_type=false)
Free the allocated data structures Hands off: Do !!NOT!! change the default of reset_storage_type: Im...
Definition: ImageBase.cpp:350
enum EColorModel GetColorModel() const
Definition: ImageBase.hh:407
static int GenerateChannelNames_(const ImageBase::EColorModel &cm, const unsigned int &numChannels, std::vector< std::string > &channelNames)
The order of the channel names in the vector is also the order of channels in the ImageBase represent...
RGBE color values, 4 channels, RADIANCE hdr format, four low dynamic channels meaning: 3x mantissa (r...
Definition: ImageBase.hh:151
void Init(unsigned int width, unsigned int height, unsigned int nChannels=1, enum EStorageType storageType=ST_unsignedchar, const bool interleaved=true)
Initialize image size and channels.
Definition: ImageBase.cpp:229
static void StringToColorModel(const std::string &str, ImageBase::EColorModel &cm)
Definition: ImageBase.cpp:1595
invalid (not set) image format
Definition: ImageBase.hh:129
enum EStorageType GetStorageType() const
Definition: ImageBase.hh:414
(8bit) unsigned char image storage type
Definition: ImageBase.hh:112
HSV, 3 channels, order: hue, sat , value.
Definition: ImageBase.hh:138
int Flip()
flips the image vertically (row order is inverted) In place function return 0 in case of success...
Definition: ImageBase.cpp:834
std::map< std::string, ChannelData > channels_
Todo: Unclear, I think one channel float, why isn&#39;t grey used for that?
Definition: ImageBase.hh:153
GreyA, 2 channels, grey plus Alpha.
Definition: ImageBase.hh:142
This is the base class for images in BIAS.
Definition: ImageBase.hh:102
Depth images A: separated for now.
Definition: ImageBase.hh:159
BGRA color values, 4 channels, order: blue,green,red,alpha.
Definition: ImageBase.hh:150
(32bit) unsigned integer image storage type
Definition: ImageBase.hh:116