00001
00002 #ifndef vimt_image_pyramid_txx_
00003 #define vimt_image_pyramid_txx_
00004
00005
00006
00007 #include "vimt_image_pyramid.h"
00008
00009 #include <vcl_cstdlib.h>
00010 #include <vcl_cassert.h>
00011
00012
00013
00014 template <class T> void vimt_image_pyramid_flatten(T& out, const vimt_image_pyramid & in)
00015 {
00016 if (!out.is_class("vimt_image_2d"))
00017 {
00018 vcl_cerr<< "ERROR: vimt_image_pyramid_flatten(const vimt_image_pyramid &)\n"
00019 << "Don't know how to deal with image type "<< in(0).is_a() << '\n';
00020 vcl_abort();
00021 }
00022
00023 const int n_levels = in.n_levels();
00024 assert(n_levels > 0);
00025 assert(out.is_a() == in(0).is_a());
00026
00027 unsigned width = 0;
00028 for (int i =0; i<n_levels; ++i)
00029 width += static_cast<const vimt_image_2d&>(in(i)).image_base().ni();
00030
00031 const unsigned nplanes = static_cast<const vimt_image_2d&>(in(0)).image_base().nplanes();
00032 unsigned height = static_cast<const vimt_image_2d&>(in(0)).image_base().nj();
00033 out.image().set_size(width, height, nplanes);
00034 out.image().fill(0);
00035
00036 for (int i=0, offset=0; i<n_levels; ++i)
00037 {
00038 const T& im_i = static_cast<const T&>(in(i));
00039 const int ni = im_i.image().ni();
00040 const int nj = im_i.image().nj();
00041
00042 for (unsigned int p=0;p<nplanes;++p)
00043 for (int y=0;y<nj;++y)
00044 for (int x=0;x<ni;++x)
00045 out.image()(x+offset, y, p) = im_i.image()(x, y, p);
00046
00047 offset+=ni;
00048 }
00049 }
00050
00051
00052 #undef VIMT_IMAGE_PYRAMID_INSTANTIATE
00053 #define VIMT_IMAGE_PYRAMID_INSTANTIATE(T) \
00054 template void vimt_image_pyramid_flatten(T &, const vimt_image_pyramid &)
00055
00056 #endif //vimt_image_pyramid_txx_