Basic Image AlgorithmS Library  2.8.0
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
ToPlanar.cpp
1 /*
2 This file is part of the BIAS library (Basic ImageAlgorithmS).
3 
4 Copyright (C) 2003, 2004 (see file CONTACTS 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 "ImageConvert.hh"
26 
27 using namespace BIAS;
28 
29 namespace BIAS {
30 
31 template <class StorageType>
32 BIASImageBase_EXPORT
34  Image<StorageType>& dest)
35 {
36  int res = -1;
37 
38  if (dest.IsEmpty())
39  dest.Init(source.GetWidth(), source.GetHeight(), source.GetChannelCount(),
40  source.GetStorageType(), false);
41 
42 #ifdef BIAS_DEBUG
43  if ( source.IsPlanar() )
44  BIASERR("ImageConvert::ToPlanar() image already planar!");
45  if (! dest.SamePixelAndChannelCount(source) )
46  BIASERR("ImageConvert::ToPlanar() not same image size");
47 #endif
48 
49  switch (dest.GetColorModel())
50  {
51  case ImageBase::CM_HSV:
52  case ImageBase::CM_BGR:
53  case ImageBase::CM_RGB:
54  res = ToPlanarRGB_(source,dest);
55  break;
57  res = ToPlanarYUYV422_(source,dest);
58  break;
59  default:
60  BIASERR("conversion to planar only implemented for RGB, BGR and"
61  <<" YUYV422 images!");
62  res = -1;
63  }
64  dest.SetInterleaved(false);
65  return res;
66 }
67 
68 
69 template <class StorageType>
71  Image<StorageType>& dest)
72 {
73  register StorageType* Red;
74 
75  // in place conversion needs extra memory
76  if (source.GetImageData() == dest.GetImageData())
77  Red = new StorageType[3 * source.GetPixelCount()];
78  else
79  Red = dest.GetImageData();
80 
81  BIASGDOUT(D_MI_TOPLANAR,"GetImageData() "<<dest.GetImageData());
82  register StorageType* Green = Red + source.GetPixelCount();
83  register StorageType* Blue = Green + source.GetPixelCount();
84  register const StorageType* ImageData = source.GetImageData();
85  register const StorageType* ImageDataStop = ImageData +
86  3 * source.GetPixelCount();
87 
88  // Copy the values to the corresponding areas in new memory
89  while (ImageData < ImageDataStop) { // Schleife vielleicht rueckwaerts?
90  *Red++ = *ImageData++;
91  *Green++ = *ImageData++;
92  *Blue++ = *ImageData++;
93  }
94 
95  if (source.GetImageData() == dest.GetImageData()){
96  // Change the pointer
98  dest.SetInterleaved(false);
99  dest.RedirectImageDataPointer( Red - dest.GetPixelCount() );
100  }
101 
102  BIASGDOUT(D_MI_TOPLANAR,"GetImageData() "<<dest.GetImageData());
103  return 0;
104 }
105 
106 
107 template <class StorageType>
109  Image<StorageType>& dest)
110 {
111 #ifdef BIAS_DEBUG
112  if (dest.GetWidth() % 2 != 0 )
113  BIASERR("ImageConvert::ToPlanar() only implemented for images with even with");
114 #endif
115 
116  register const StorageType* ImageData = source.GetImageData();
117  register const StorageType* ImageDataStop = ImageData + 2 * source.GetPixelCount();
118  register StorageType *Y, *U, *V;
119 
120  if (source.GetImageData() == dest.GetImageData())
121  Y = new StorageType[2 * source.GetPixelCount()];
122  else
123  Y = dest.GetImageData();
124  U = Y + source.GetPixelCount();
125  V = U + source.GetPixelCount()/2;
126 
127  while (ImageData < ImageDataStop){
128  *Y++ = *ImageData++;
129  *U++ = *ImageData++;
130  *Y++ = *ImageData++;
131  *V++ = *ImageData++;
132  }
133 
134  if (source.GetImageData() == dest.GetImageData()){
136  dest.SetInterleaved(false);
137  dest.RedirectImageDataPointer( Y - dest.GetPixelCount() );
138  }
139  return 0;
140 }
141 
142 template <class StorageType>
144  Image<StorageType>& Image1,
145  Image<StorageType>& Image2,
146  Image<StorageType>& Image3)
147 {
148  int res = 0;
149 #ifdef BIAS_DEBUG
150  if ( source.GetChannelCount() == 1 )
151  BIASERR("ImageConvert::FromInterleaved() does not make sense with one channel images");
152  if ( Image1.IsEmpty() || Image2.IsEmpty() || Image3.IsEmpty() )
153  BIASERR("ImageConvert::FromInterleaved() do not call with empty images");
154  if (source.IsPlanar())
155  BIASERR("ImageConvert::FromInterleaved() image is not interleaved");
156 #endif
157  switch (source.GetColorModel()){
159  res = FromInterleavedYUYV422_(source,Image1, Image2, Image3);
160  break;
161  case ImageBase::CM_RGB:
162  res = FromInterleavedRGB_(source,Image1, Image2, Image3);
163  break;
164  default:
165  BIASERR("ImageConvert::ToPlanar() color model not implemented");
166  res = -1;
167  break;
168  }
169  return res;
170 }
171 
172 template <class StorageType>
177 {
178 #ifdef BIAS_DEBUG
179  unsigned int Width = source.GetWidth();
180  unsigned int Height = source.GetHeight();
181  if ( ( Height != R.GetHeight() ) ||
182  ( Height != G.GetHeight() ) ||
183  ( Height != B.GetHeight() ) ||
184  ( Width != R.GetWidth() ) ||
185  ( Width != G.GetWidth() ) ||
186  ( Width != B.GetWidth() ) )
187  BIASERR("FromInterleavedRGB_: wrong argument image size");
188 #endif
189 
190  register StorageType* r = R.GetImageData();
191  register StorageType* g = G.GetImageData();
192  register StorageType* b = B.GetImageData();
193  register const StorageType* ImageData = source.GetImageData();
194  register const StorageType* ImageDataEnd = ImageData + source.GetPixelCount() * 3;
195  while (ImageData < ImageDataEnd){
196  *r++ = *ImageData++;
197  *g++ = *ImageData++;
198  *b++ = *ImageData++;
199  }
200 
201  return 0;
202 }
203 
204 template <class StorageType>
209 {
210 #ifdef BIAS_DEBUG
211  unsigned int Width = source.GetWidth();
212  unsigned int Height = source.GetHeight();
213  if ( ( Height != Y.GetHeight() ) ||
214  ( Height != U.GetHeight() ) ||
215  ( Height != V.GetHeight() ) ||
216  ( Width != Y.GetWidth() ) ||
217  ( Width != U.GetWidth() * 2 ) ||
218  ( Width != V.GetWidth() * 2 ) )
219  BIASERR("ImageConvert::FromInterleavedYUYV422 wrong argument image size");
220 #endif
221 
222  register StorageType* y = Y.GetImageData();
223  register StorageType* u = U.GetImageData();
224  register StorageType* v = V.GetImageData();
225  register const StorageType* ImageData = source.GetImageData();
226  register const StorageType* ImageDataEnd = ImageData + source.GetPixelCount() * 2;
227  while (ImageData < ImageDataEnd){
228  *y++ = *ImageData++;
229  *u++ = *ImageData++;
230  *y++ = *ImageData++;
231  *v++ = *ImageData++;
232  }
233 
234  return 0;
235 }
236 
237 
238 } // namespace BIAS
YUYV422, 2 channels, full luminance Y, subsampled half U,V.
Definition: ImageBase.hh:133
bool IsEmpty() const
check if ImageData_ points to allocated image buffer or not
Definition: ImageBase.hh:245
static int ToPlanarYUYV422_(const Image< StorageType > &source, Image< StorageType > &dest)
Definition: ToPlanar.cpp:108
static BIASImageBase_EXPORT int FromInterleaved(const Image< StorageType > &source, Image< StorageType > &Image1, Image< StorageType > &Image2, Image< StorageType > &Image3)
Extracts color planes to argument images without changing source.
bool IsPlanar() const
Definition: ImageBase.hh:484
static BIASImageBase_EXPORT int ToPlanar(const Image< StorageType > &source, Image< StorageType > &dest)
Converts the existing image to an planar version.
Definition: ToPlanar.cpp:33
unsigned int GetWidth() const
Definition: ImageBase.hh:312
void SetInterleaved(bool interleaved)
Definition: ImageBase.hh:568
color values, 3 channels, order: blue,green,red
Definition: ImageBase.hh:132
static int FromInterleavedRGB_(const Image< StorageType > &source, Image< StorageType > &R, Image< StorageType > &G, Image< StorageType > &B)
Definition: ToPlanar.cpp:173
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
unsigned int GetHeight() const
Definition: ImageBase.hh:319
The image template class for specific storage types.
Definition: Image.hh:78
bool SamePixelAndChannelCount(const ImageBase &Image) const
checks if data area has same &quot;size&quot; as Image of other type
Definition: ImageBase.hh:73
void Init(unsigned int Width, unsigned int Height, unsigned int channels=1, enum EStorageType storageType=ST_unsignedchar, const bool interleaved=true)
calls Init from ImageBase storageType is ignored, just dummy argument
Definition: Image.cpp:421
const StorageType * GetImageData() const
overloaded GetImageData() from ImageBase
Definition: Image.hh:137
enum EColorModel GetColorModel() const
Definition: ImageBase.hh:407
static int ToPlanarRGB_(const Image< StorageType > &source, Image< StorageType > &dest)
Definition: ToPlanar.cpp:70
void ReleaseImageDataPointer()
Releases ImageData_ (to be used together with RedirectImageDataPointer)
Definition: ImageBase.hh:90
enum EStorageType GetStorageType() const
Definition: ImageBase.hh:414
HSV, 3 channels, order: hue, sat , value.
Definition: ImageBase.hh:138
static int FromInterleavedYUYV422_(const Image< StorageType > &source, Image< StorageType > &Y, Image< StorageType > &U, Image< StorageType > &V)
Definition: ToPlanar.cpp:205
unsigned long int GetPixelCount() const
returns number of pixels in image
Definition: ImageBase.hh:422
void RedirectImageDataPointer(void *data)
This method takes data and set the internal image data pointer to this.
Definition: ImageBase.hh:859