commit a8be2904635fd58f4eb9650a3053d4d5e8564f30
parent 2f4d85e09f48a18b90cbf25a901e324d2cfe7b20
Author: Fabian Wermelinger <fabianw@mavt.ethz.ch>
Date: Fri, 29 Apr 2016 00:07:16 +0200
integrated cartridge into SceneProcessor
Diffstat:
10 files changed, 100 insertions(+), 108 deletions(-)
diff --git a/apps/polaroidCamera/NormalizerCartridge.h b/apps/polaroidCamera/NormalizerCartridge.h
@@ -11,7 +11,7 @@
class NormalizerCartridge : public Cartridge
{
public:
- NormalizerCartridge(ArgumentParser& parser) : Cartridge(parser) {}
+ NormalizerCartridge(ArgumentParser& parser) : Cartridge(parser), m_dataMin(0), m_dataMax(0) {}
virtual void capture(PhotoPaper& photo, Slice& data)
{
@@ -21,24 +21,26 @@ public:
string desc("2D Normalized Slice Data");
photo.set_description(desc.c_str());
- // compute min/max
- Real data_min = data(0,0);
- Real data_max = data(0,0);
+ // compute min/max for shader
+ m_dataMin = data(0,0);
+ m_dataMax = data(0,0);
for (int h=0; h < data.height(); ++h)
for (int w=0; w < data.width(); ++w)
{
- data_min = min(data_min, data(w,h));
- data_max = max(data_max, data(w,h));
+ m_dataMin = min(m_dataMin, data(w,h));
+ m_dataMax = max(m_dataMax, data(w,h));
}
- const Real data_normInv = 1.0 / (data_max - data_min);
+ const Real data_normInv = 1.0 / (m_dataMax - m_dataMin);
- // compute pixel
+ // pixel shader
for (int h=0; h < data.height(); ++h)
for (int w=0; w < data.width(); ++w)
- photo.set_pixel(w, h, (data(w,h) - data_min) * data_normInv);
+ photo.set_pixel(w, h, (data(w,h) - m_dataMin) * data_normInv);
photo.write();
}
+
+ virtual void compute(Slice& data) { }
};
#endif /* NORMALIZERCARTRIDGE_H_ONAUDSVX */
diff --git a/apps/polaroidCamera/SceneProcessor.cpp b/apps/polaroidCamera/SceneProcessor.cpp
@@ -11,15 +11,11 @@
using namespace std;
-void SceneProcessor::_set_cartridge()
+void SceneProcessor::_prepare_cam()
{
}
-void SceneProcessor::_set_paper()
-{
-}
-
-void _load_cam(Polaroid& cam, const char* const fname) const
+void SceneProcessor::_load_cam(Polaroid& cam, const char* const fname, const bool isroot) const
{
const double fraction = m_parser("-fraction").asDouble(0.5);
const int direction = m_parser("-direction").asInt(0);
@@ -40,11 +36,10 @@ void _load_cam(Polaroid& cam, const char* const fname) const
}
}
-void sceneprocessor::process1212(const vector<char*>& scenes, const bool isroot)
+void SceneProcessor::process1212(const vector<char*>& scenes, const bool isroot)
{
- Polaroid mycam;
- _set_cartridge();
- _set_paper();
+ _prepare_cam();
+ Polaroid mycam(m_cartridge);
for (size_t i=0; i<scenes.size(); ++i)
{
@@ -55,15 +50,16 @@ void sceneprocessor::process1212(const vector<char*>& scenes, const bool isroot)
basename = basename.substr(0, basename.find_last_of("."));
m_photo->make_new(basename+"-polaroid", mycam.width(), mycam.height());
- mycam.capture(*m_cartridge, *m_photo);
+ mycam.capture(*m_photo);
if (isroot)
printf("[Progress %3.1f %%]\n", static_cast<double>(i)/scenes.size()*100.0);
}
}
-void sceneprocessor::process1122(const vector<char*>& scenes)
+void SceneProcessor::process1122(const vector<char*>& scenes, const bool isroot)
{
+ _prepare_cam();
vector<Polaroid> mycams(scenes.size());
// 1.) load scenes
@@ -71,13 +67,12 @@ void sceneprocessor::process1122(const vector<char*>& scenes)
{
Polaroid& cam = mycams[i];
_load_cam(cam, scenes[i]);
+ cam.insertCartridge(m_cartridge);
+ cam.computeScene();
if (isroot)
- printf("[Load Progress %3.1f %%]\n", static_cast<double>(i)/scenes.size()*100.0);
+ printf("[Scene Progress %3.1f %%]\n", static_cast<double>(i)/scenes.size()*100.0);
}
- _set_cartridge();
- _set_paper();
-
// 2.) compute photos
for (size_t i=0; i<scenes.size(); ++i)
{
@@ -88,7 +83,7 @@ void sceneprocessor::process1122(const vector<char*>& scenes)
basename = basename.substr(0, basename.find_last_of("."));
m_photo->make_new(basename+"-polaroid", cam.width(), cam.height());
- cam.capture(*m_cartridge, *m_photo);
+ cam.capture(*m_photo);
if (isroot)
printf("[Photo Progress %3.1f %%]\n", static_cast<double>(i)/scenes.size()*100.0);
diff --git a/apps/polaroidCamera/SceneProcessor.h b/apps/polaroidCamera/SceneProcessor.h
@@ -22,13 +22,19 @@ private:
PhotoPaper* m_photo;
// helper
- void _set_cartridge();
- void _set_paper();
- void _load_cam(Polaroid& cam, const char* const fname) const;
+ void _prepare_cam();
+ void _load_cam(Polaroid& cam, const char* const fname, const bool isroot=true) const;
+ inline void _dispose()
+ {
+ if (m_cartridge) delete m_cartridge;
+ if (m_photo) delete m_photo;
+ m_cartridge = nullptr;
+ m_photo = nullptr;
+ }
public:
SceneProcessor(ArgumentParser& parser) : m_parser(parser), m_cartridge(nullptr), m_photo(nullptr) {}
- ~SceneProcessor() {}
+ ~SceneProcessor() { _dispose(); }
void process1212(const std::vector<char*>& scenes, const bool isroot=true);
void process1122(const std::vector<char*>& scenes, const bool isroot=true);
diff --git a/apps/polaroidCamera/SchlierenCartridge.h b/apps/polaroidCamera/SchlierenCartridge.h
@@ -13,7 +13,7 @@ class SchlierenCartridge : public Cartridge
public:
SchlierenCartridge(ArgumentParser& parser) : Cartridge(parser) {}
- virtual void capture(PhotoPaper& photo, Slice& data)
+ virtual void capture(PhotoPaper& photo, Slice& data) const
{
photo.resize(data.width(), data.height());
diff --git a/apps/polaroidCamera/TransmissionCartridge.h b/apps/polaroidCamera/TransmissionCartridge.h
@@ -28,6 +28,8 @@ public:
photo.write();
}
+
+ virtual void compute(Slice& data) {}
};
#endif /* TRANSMISSIONCARTRIDGE_H_Z4VDKHDO */
diff --git a/apps/polaroidCamera/polaroidCameraMPI.cpp b/apps/polaroidCamera/polaroidCameraMPI.cpp
@@ -52,69 +52,22 @@ int main(int argc, char* argv[])
- Cartridge * const mycartridge;
- PhotoPaper* myphoto;
- if (myparser("-format").asString("png") == "png")
- {
- mycartridge = new NormalizerCartridge(myparser);
- if (myparser("-type").asString("hsv") == "hsv")
- myphoto = new PNG_HSV;
- else if (myparser("-type").asString("hsv") == "mono")
- myphoto = new PNG_MONO;
- }
- else if (myparser("-format").asString("png") == "hdf5")
- {
- mycartridge = new TransmissionCartridge(myparser);
- myphoto = new PhotoHDF5;
- }
-
-
-
-
- vector<Polaroid> mycams(myscenes.size());
- for (size_t i=0; i<myscenes.size(); ++i)
- {
- Polaroid& thiscam = mycams[i];
-
- string basename(myscenes[i]);
- if (basename.find_last_of(".") != string::npos)
- basename = basename.substr(0, basename.find_last_of("."));
-
- if (input_type == "hdf5")
- thiscam.load_hdf5(myscenes[i], fraction, direction, channel);
- else if (input_type == "wavelet")
- thiscam.load_wavelet(myscenes[i], fraction, direction, channel, byte_swap, wavelet_type);
-
- if (worker.isroot())
- printf("[Loading Progress %3.1f %%]\n", static_cast<double>(i)/myscenes.size()*100.0);
- }
-
- for (size_t i=0; i<mycams.size(); ++i)
- {
- Polaroid& thiscam = mycams[i];
-
- string basename(myscenes[i]);
- if (basename.find_last_of(".") != string::npos)
- basename = basename.substr(0, basename.find_last_of("."));
-
- // string basename(scene);
- // if (basename.find_last_of(".") != string::npos)
- // basename = basename.substr(0, basename.find_last_of("."));
-
- // if (input_type == "hdf5")
- // mycam.load_hdf5(scene, fraction, direction, channel);
- // else if (input_type == "wavelet")
- // mycam.load_wavelet(scene, fraction, direction, channel, byte_swap, wavelet_type);
-
- myphoto->make_new(basename+"-polaroid", thiscam.width(), thiscam.height());
- thiscam.capture(*mycartridge, *myphoto);
-
- if (worker.isroot())
- printf("[Photo Progress %3.1f %%]\n", static_cast<double>(i)/myscenes.size()*100.0);
- }
+ // Cartridge * const mycartridge;
+ // PhotoPaper* myphoto;
+ // if (myparser("-format").asString("png") == "png")
+ // {
+ // mycartridge = new NormalizerCartridge(myparser);
+ // if (myparser("-type").asString("hsv") == "hsv")
+ // myphoto = new PNG_HSV;
+ // else if (myparser("-type").asString("hsv") == "mono")
+ // myphoto = new PNG_MONO;
+ // }
+ // else if (myparser("-format").asString("png") == "hdf5")
+ // {
+ // mycartridge = new TransmissionCartridge(myparser);
+ // myphoto = new PhotoHDF5;
+ // }
- delete mycartridge;
- delete myphoto;
diff --git a/include/Cartridge.h b/include/Cartridge.h
@@ -14,12 +14,15 @@ class Cartridge
{
protected:
ArgumentParser& m_parser;
+ bool m_bComputed;
public:
- Cartridge(ArgumentParser& parser) : m_parser(parser) {}
+ Cartridge(ArgumentParser& parser) : m_parser(parser), m_bComputed(false) {}
virtual ~Cartridge() {}
virtual void capture(PhotoPaper& photo, Slice& data) = 0;
+ virtual void compute(Slice& data) = 0;
+ inline void reset() { m_bComputed = false; }
};
#endif /* CARTRIDGE_H_IRUVKOCT */
diff --git a/include/Polaroid.h b/include/Polaroid.h
@@ -15,28 +15,46 @@ class Polaroid
{
protected:
Slice m_data;
+ bool m_dataLoaded;
- // Cartridge inserted?
- bool m_loaded;
+ // Cartridge
+ Cartridge* m_cartridge;
+ bool m_cartridgeInserted;
public:
- Polaroid() : m_loaded(false) { }
- virtual ~Polaroid() {}
+ Polaroid() : m_dataLoaded(false), m_cartridge(nullptr), m_cartridgeInserted(false) { }
+ Polaroid(Cartridge* cart) : m_dataLoaded(false), m_cartridge(cart), m_cartridgeInserted(true) { }
+ ~Polaroid() {}
+
+ // cartridge loader
+ inline void insertCartridge(Cartridge* cart)
+ {
+ // memory management of cartridges is not handled by the Polaroid cam
+ m_cartridge = cart;
+ m_cartridgeInserted = true;
+ }
// scene loader
- virtual void load_hdf5(const char* filename, const double fraction, const int dir, const int channel=0);
- virtual void load_wavelet(const char* filename, const double fraction, const int dir, const int channel=0, const bool doswapping=false, const int wtype=1);
+ void load_hdf5(const char* filename, const double fraction, const int dir, const int channel=0);
+ void load_wavelet(const char* filename, const double fraction, const int dir, const int channel=0, const bool doswapping=false, const int wtype=1);
// capture scene
- inline bool check_scene() const { return m_loaded; }
- inline void capture(Cartridge& cartridge, PhotoPaper& photo)
+ inline void capture(PhotoPaper& photo)
+ {
+ if (m_dataLoaded && m_cartridgeInserted)
+ m_cartridge->capture(photo, m_data);
+ }
+ inline void computeScene()
{
- if (m_loaded)
- cartridge.capture(photo, m_data);
+ if (m_dataLoaded && m_cartridgeInserted)
+ m_cartridge->compute(m_data);
}
+ // data accessors
inline int width() const { return m_data.width(); }
inline int height() const { return m_data.height(); }
+ inline Real min() const { return m_data.min(); }
+ inline Real max() const { return m_data.max(); }
};
#endif /* POLAROID_H_HXFL9YPG */
diff --git a/include/Types.h b/include/Types.h
@@ -7,6 +7,7 @@
#define TYPES_H_QATFIWCK
#include <cassert>
+#include <algorithm>
#include "common.h"
template <int _SX, int _EX, int _SY, int _EY>
@@ -54,8 +55,20 @@ public:
inline int width() const { return m_width; }
inline int height() const { return m_height; }
- // inline Real* const data() { return m_data; }
- // inline const Real* const data() const { return m_data; }
+ inline Real min() const
+ {
+ Real f = m_data[0];
+ for (int i = 1; i < m_N; ++i)
+ f = std::min(f, m_data[i]);
+ return f;
+ }
+ inline Real max() const
+ {
+ Real f = m_data[0];
+ for (int i = 1; i < m_N; ++i)
+ f = std::max(f, m_data[i]);
+ return f;
+ }
};
typedef Slice2D<0,0,-2,2> Slice;
diff --git a/src/Polaroid.cpp b/src/Polaroid.cpp
@@ -85,7 +85,7 @@ void Polaroid::load_hdf5(const char* filename, const double fraction, const int
}
delete [] data;
- m_loaded = true;
+ m_dataLoaded = true;
#else
fprintf(stderr, "WARNING: Executable was compiled without HDF support...\n");
@@ -172,7 +172,7 @@ void Polaroid::load_wavelet(const char* filename, const double fraction, const i
abort();
}
- m_loaded = true;
+ m_dataLoaded = true;
#else
fprintf(stderr, "WARNING: Executable was compiled without wavelet compressor support...\n");
#endif /* _USE_CUBISMZ_ */