polaroid-pp

Schlieren and contour plot tool
git clone https://git.0xfab.ch/polaroid-pp.git
Log | Files | Refs | Submodules | README | LICENSE

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:
Mapps/polaroidCamera/NormalizerCartridge.h | 20+++++++++++---------
Mapps/polaroidCamera/SceneProcessor.cpp | 29++++++++++++-----------------
Mapps/polaroidCamera/SceneProcessor.h | 14++++++++++----
Mapps/polaroidCamera/SchlierenCartridge.h | 2+-
Mapps/polaroidCamera/TransmissionCartridge.h | 2++
Mapps/polaroidCamera/polaroidCameraMPI.cpp | 77+++++++++++++++--------------------------------------------------------------
Minclude/Cartridge.h | 5++++-
Minclude/Polaroid.h | 38++++++++++++++++++++++++++++----------
Minclude/Types.h | 17+++++++++++++++--
Msrc/Polaroid.cpp | 4++--
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_ */