icub-basic-demos
ScaleSpace.cpp
Go to the documentation of this file.
1 // -*- mode:C++; tab-width:4; c-basic-offset:4; indent-tabs-mode:nil -*-
2 
3 // Copyright: (C) 2006-2007 Alex Bernardino, ISR-IST
4 // Authors: Alex Bernardino
5 // CopyPolicy: Released under the terms of the GNU GPL v2.0.
6 
17 #include <iCub/ScaleSpace.h>
18 
19 #include <cstring>
20 #include <cstdlib>
21 #include <cmath>
22 
23 ScaleSpace::ScaleSpace()
24 {
25  _width = _height = _levels = 0;
26  _allocated = false;
27  _scales = NULL;
28  _scalespace = NULL;
29  _filters = NULL;
30 }
31 
32 ScaleSpace::~ScaleSpace()
33 {
34  FreeResources();
35 }
36 
37 bool ScaleSpace::AllocateResources(int lines, int cols, int levels, double *scales)
38 {
39  int i;
40  if(lines < 10) //image too small
41  return false;
42  if(cols < 10) //image too small
43  return false;
44  if(levels < 1) //
45  return false;
46 
47  if(_allocated)
48  FreeResources();
49  _width = cols;
50  _height = lines;
51  _levels = levels;
52 
53  _scales = (double*)malloc(_levels*sizeof(double));
54  if(scales == 0) return false;
55  _scalespace = (float**)malloc(_levels*sizeof(float*));
56  if(_scalespace == 0) return false;
57  _filters = new FastGauss[levels];
58  if(_filters == 0) return false;
59  for(i=0; i < levels; i++)
60  {
61  _scales[i] = scales[i];
62  _filters[i].AllocateResources(lines, cols, _scales[i]);
63  _scalespace[i] = (float*)malloc(_width*_height*sizeof(float));
64  if(_scalespace[i] == 0) return false;
65  }
66  _allocated = true;
67  return true;
68 }
69 
70 bool ScaleSpace::FreeResources()
71 {
72  int i;
73  if(!_allocated)
74  return true;
75  delete [] _filters;
76  free(_scales);
77  for(i=0; i < _levels; i++)
78  free(_scalespace[i]);
79  free(_scalespace);
80  _allocated = false;
81  return true;
82 }
83 
85 bool ScaleSpace::BuildLevel(int level, float *in)
86 {
87  if(!_allocated)
88  return false;
89  if( level < 0 || level >= _levels )
90  return false;
91  return _filters[level].GaussFilt(in, _scalespace[level]);
92 }
93 
95 bool ScaleSpace::BuildAll(float *in)
96 {
97  int i;
98  bool retval = true;
99  if(!_allocated)
100  return false;
101  for(i = 0; i < _levels; i++)
102  retval = (retval && _filters[i].GaussFilt(in, _scalespace[i]));
103  return retval;
104 }
106 float* ScaleSpace::GetLevel(int level)
107 {
108  if(!_allocated)
109  return 0;
110  if( level < 0 || level >= _levels )
111  return 0;
112  return _scalespace[level];
113 }
Implements a Gaussian Scale Space for floating point images.