diff options
| author | Tim Redfern <tim@herge.(none)> | 2013-05-16 17:10:08 +0100 |
|---|---|---|
| committer | Tim Redfern <tim@herge.(none)> | 2013-05-16 17:10:08 +0100 |
| commit | fad2c7236e70faf0669dde3e6cbd51986fdbc6ee (patch) | |
| tree | 3e639c8ccb12ab8289326eaa657abd96fa108f21 /vaa3d_wrapper/loadV3dFFMpeg.cpp | |
| parent | 8d88180d523d82e5c6535ea03ef22791d0cbd9d0 (diff) | |
major leakage
Diffstat (limited to 'vaa3d_wrapper/loadV3dFFMpeg.cpp')
| -rw-r--r-- | vaa3d_wrapper/loadV3dFFMpeg.cpp | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/vaa3d_wrapper/loadV3dFFMpeg.cpp b/vaa3d_wrapper/loadV3dFFMpeg.cpp new file mode 100644 index 0000000..90a6dbc --- /dev/null +++ b/vaa3d_wrapper/loadV3dFFMpeg.cpp @@ -0,0 +1,143 @@ +#include "loadV3dFFMpeg.h" +#include "FFMpegVideo.h" +#include <iostream> + +#ifdef USE_FFMPEG + +using namespace std; + +bool saveStackFFMpeg(const char * file_name, const My4DImage& img, enum CodecID codec_id) +{ + try { + Image4DProxy<My4DImage> proxy(const_cast<My4DImage*>(&img)); + double default_irange = 1.0; // assumes data range is 0-255.0 + if (proxy.su > 1) { + default_irange = 1.0 / 16.0; // 0-4096, like our microscope images + } + std::vector<double> imin(proxy.sc, 0.0); + std::vector<double> irange2(proxy.sc, default_irange); + // rescale if converting from 16 bit to 8 bit + if (proxy.su > 1) { + if (img.p_vmin && img.p_vmax) + proxy.set_minmax(img.p_vmin, img.p_vmax); + if (proxy.has_minmax()) { + for (int c = 0; c < proxy.sc; ++c) { + imin[c] = proxy.vmin[c]; + irange2[c] = 255.0 / (proxy.vmax[c] - proxy.vmin[c]); + } + } + } + FFMpegEncoder encoder(file_name, proxy.sx, proxy.sy, codec_id); + for (int z = 0; z < proxy.sz; ++z) { + for (int y = 0; y < proxy.sy; ++y) { + for (int x = 0; x < proxy.sx; ++x) { + for (int c = 0; c < 3; ++c) { + int ic = c; + if (c >= proxy.sc) ic = 0; // single channel volume to gray RGB movie + double val = proxy.value_at(x, y, z, ic); + val = (val - imin[ic]) * irange2[ic]; // rescale to range 0-255 + encoder.setPixelIntensity(x, y, c, (int)val); + } + } + } + encoder.write_frame(); + } + return true; + } catch (...) {} + + return false; +} + +bool loadStackFFMpeg(const char* fileName, Image4DSimple& img) +{ + return loadStackFFMpeg(QUrl::fromLocalFile(fileName), img); +} + +bool loadStackFFMpeg(QUrl url, Image4DSimple& img) +{ + try { + FFMpegVideo video(url); + if (! video.isOpen) + return false; + int sx = video.getWidth(); + int sy = video.getHeight(); + int sz = video.getNumberOfFrames(); + int sc = video.getNumberOfChannels(); + // cout << "Number of frames = " << sz << endl; + + img.createBlankImage(sx, sy, sz, sc, 1); // 1 byte = 8 bits per value + Image4DProxy<Image4DSimple> proxy(&img); + + int frameCount = 0; + for (int z = 0; z < sz; ++z) + { + video.fetchFrame(z); + int z = frameCount; + frameCount++; + for(int c = 0; c < sc; ++c) { + for (int y = 0; y < sy; ++y) { + for (int x = 0; x < sx; ++x) { + proxy.put_at(x, y, z, c, + video.getPixelIntensity(x, y, (FFMpegVideo::Channel)c) + ); + } + } + } + } + cout << "Number of frames found = " << frameCount << endl; + + return true; + + } catch(...) {} + + return false; +} + +bool loadStackFFMpegAsGray(const char* fileName, Image4DSimple& img) +{ + loadStackFFMpegAsGray(QUrl::fromLocalFile(fileName), img); +} + +bool loadStackFFMpegAsGray(QUrl url, Image4DSimple& img) +{ + try { + FFMpegVideo video(url); + int sx = video.getWidth(); + int sy = video.getHeight(); + int sz = video.getNumberOfFrames(); + int sc = video.getNumberOfChannels(); + // cout << "Number of frames = " << sz << endl; + + img.createBlankImage(sx, sy, sz, 1, 1); // 1 byte = 8 bits per value + Image4DProxy<Image4DSimple> proxy(&img); + + int frameCount = 0; + for (int z = 0; z < sz; ++z) + { + video.fetchFrame(z); + int z = frameCount; + frameCount++; + for (int y = 0; y < sy; ++y) { + for (int x = 0; x < sx; ++x) { + // Use average of R,G,B as gray value + int val = 0; + for(int c = 0; c < sc; ++c) { + val += video.getPixelIntensity(x, y, (FFMpegVideo::Channel)c); + } + val /= sc; // average of rgb + proxy.put_at(x, y, z, 0, val); + } + } + } + // cout << "Number of frames found = " << frameCount << endl; + + return true; + + } catch(...) {} + + return false; +} + +#endif // USE_FFMPEG + + |
