waifu2x-caffe/common/stImage.h

129 lines
4.4 KiB
C
Raw Normal View History

#pragma once
#include "waifu2x.h"
class stImage
{
private:
cv::Mat mOrgFloatImage;
int mOrgChannel;
cv::Size_<int> mOrgSize;
bool mIsRequestDenoise;
cv::Mat mTmpImageRGB; // RGB(<28><><EFBFBD><EFBFBD><E982A2>Y)
cv::Mat mTmpImageA; // <20><><EFBFBD>`<60><><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><6C>
cv::Mat mEndImage; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int pad_w1;
int pad_h1;
int pad_w2;
int pad_h2;
public:
struct stOutputExtentionElement
{
std::wstring ext;
std::vector<int> depthList;
boost::optional<int> imageQualityStart;
boost::optional<int> imageQualityEnd;
boost::optional<int> imageQualityDefault;
boost::optional<int> imageQualitySettingVolume;
};
const static std::vector<stOutputExtentionElement> OutputExtentionList;
private:
static Waifu2x::eWaifu2xError LoadMatBySTBI(cv::Mat &im, const std::vector<char> &img_data);
static cv::Mat ConvertToFloat(const cv::Mat &im);
static Waifu2x::eWaifu2xError AlphaMakeBorder(std::vector<cv::Mat> &planes, const cv::Mat &alpha, const int offset);
static cv::Mat DeconvertFromFloat(const cv::Mat &im, const int depth);
static void AlphaCleanImage(cv::Mat &im);
static Waifu2x::eWaifu2xError WriteMat(const cv::Mat &im, const boost::filesystem::path &output_file, const boost::optional<int> &output_quality);
void ConvertToNetFormat(const int input_plane, const int alpha_offset);
Waifu2x::eWaifu2xError CreateBrightnessImage(const cv::Mat &float_image, cv::Mat &im);
void PaddingImage(const cv::Mat &input, const int net_offset, const int outer_padding,
const int crop_w, const int crop_h, cv::Mat &output);
Waifu2x::eWaifu2xError CreateZoomColorImage(const cv::Mat &float_image, const cv::Size_<int> &zoom_size, std::vector<cv::Mat> &cubic_planes);
// <20>g<EFBFBD><67><EFBFBD>A<EFBFBD>p<EFBFBD>f<EFBFBD>B<EFBFBD><42><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD><E6919C><EFBFBD>
// <20><><EFBFBD>̊֐<CC8A><D690><EFBFBD><EFBFBD>Ăяo<D18F><6F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>AmTmpImageRGB<47>͋<EFBFBD><CD8B>ɂȂ<C982><C882>̂Œ<CC82><C592><EFBFBD>
void GetScalePaddingedImage(cv::Mat &in, cv::Mat &out, cv::Size_<int> &size, const int net_offset, const int outer_padding,
const int crop_w, const int crop_h, const int scale);
// <20>ϊ<EFBFBD><CF8A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6919C><EFBFBD>ݒ<EFBFBD>
// size: GetScalePaddingedImage()<29>Ŏ擾<C58E><E693BE><EFBFBD><EFBFBD>size
void SetReconstructedImage(cv::Mat &dst, cv::Mat &src, const cv::Size_<int> &size, const int inner_scale);
void DeconvertFromNetFormat(const int input_plane);
void ShrinkImage(const double scale);
static int DepthBitToCVDepth(const int depth_bit);
static double GetValumeMaxFromCVDepth(const int cv_depth);
static double GetEPS(const int cv_depth);
public:
stImage();
~stImage();
void Clear();
static Waifu2x::eWaifu2xError LoadMat(cv::Mat &im, const boost::filesystem::path &input_file);
Waifu2x::eWaifu2xError Load(const boost::filesystem::path &input_file);
// source: (4<>`<60><><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><6C><EFBFBD>̏ꍇ<CC8F><EA8D87>)RGBA<42>ȉ<EFBFBD><C889>f<EFBFBD>z<EFBFBD><7A>
// dest: (4<>`<60><><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><6C><EFBFBD>̏ꍇ<CC8F><EA8D87>)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RGBA<42>ȉ<EFBFBD><C889>f<EFBFBD>z<EFBFBD><7A>
// width: width<74>̏c<CC8F><63>
// height: height<68>̉<EFBFBD><CC89><EFBFBD>
// channel: source<63>̃`<60><><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><6C><EFBFBD><EFBFBD>
// stride: source<63>̃X<CC83>g<EFBFBD><67><EFBFBD>C<EFBFBD>h(<28>o<EFBFBD>C<EFBFBD>g<EFBFBD>P<EFBFBD><50>)
// source<63><65>Postprocess()<29><><EFBFBD>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD>܂ő<DC82><C591>݂<EFBFBD><DD82>Ă<EFBFBD><C482><EFBFBD><EFBFBD>K<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Waifu2x::eWaifu2xError Load(const void* source, const int width, const int height, const int channel, const int stride);
2016-07-03 21:55:20 +09:00
double GetScaleFromWidth(const int width) const;
double GetScaleFromHeight(const int width) const;
bool RequestDenoise() const;
// <20>O<EFBFBD><4F><EFBFBD><EFBFBD>
// RGB<47><42><EFBFBD>f<EFBFBD><66><EFBFBD>̏ꍇ<CC8F>͂<EFBFBD><CD82><EFBFBD>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɂ<EFBFBD>mOrgFloatImage<67><65><EFBFBD><EFBFBD><EFBFBD>ɂȂ<C982><C882>Ă<EFBFBD><C482><EFBFBD><EFBFBD>̂Œ<CC82><C592><EFBFBD>
void Preprocess(const int input_plane, const int net_offset);
bool HasAlpha() const;
// <20>g<EFBFBD><67><EFBFBD>A<EFBFBD>p<EFBFBD>f<EFBFBD>B<EFBFBD><42><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD><E6919C><EFBFBD>
// <20><><EFBFBD>̊֐<CC8A><D690><EFBFBD><EFBFBD>Ăяo<D18F><6F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>AmTmpImageRGB<47>͋<EFBFBD><CD8B>ɂȂ<C982><C882>̂Œ<CC82><C592><EFBFBD>
void GetScalePaddingedRGB(cv::Mat &im, cv::Size_<int> &size, const int net_offset, const int outer_padding,
const int crop_w, const int crop_h, const int scale);
// <20>ϊ<EFBFBD><CF8A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6919C><EFBFBD>ݒ<EFBFBD>
// <20><><EFBFBD>̊֐<CC8A><D690><EFBFBD><EFBFBD>Ăяo<D18F><6F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Aim<69>͋<EFBFBD><CD8B>ɂȂ<C982><C882>̂Œ<CC82><C592><EFBFBD>
// size: GetScalePaddingedImage()<29>Ŏ擾<C58E><E693BE><EFBFBD><EFBFBD>size
void SetReconstructedRGB(cv::Mat &im, const cv::Size_<int> &size, const int inner_scale);
// <20>g<EFBFBD><67><EFBFBD>A<EFBFBD>p<EFBFBD>f<EFBFBD>B<EFBFBD><42><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD><E6919C><EFBFBD>
// <20><><EFBFBD>̊֐<CC8A><D690><EFBFBD><EFBFBD>Ăяo<D18F><6F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>AmTmpImageA<65>͋<EFBFBD><CD8B>ɂȂ<C982><C882>̂Œ<CC82><C592><EFBFBD>
void GetScalePaddingedA(cv::Mat &im, cv::Size_<int> &size, const int net_offset, const int outer_padding,
const int crop_w, const int crop_h, const int scale);
// <20>g<EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6919C><EFBFBD>ݒ<EFBFBD>
// <20><><EFBFBD>̊֐<CC8A><D690><EFBFBD><EFBFBD>Ăяo<D18F><6F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Aim<69>͋<EFBFBD><CD8B>ɂȂ<C982><C882>̂Œ<CC82><C592><EFBFBD>
// size: GetScalePaddingedImage()<29>Ŏ擾<C58E><E693BE><EFBFBD><EFBFBD>size
void SetReconstructedA(cv::Mat &im, const cv::Size_<int> &size, const int inner_scale);
void Postprocess(const int input_plane, const double scale, const int depth);
cv::Mat GetEndImage() const;
Waifu2x::eWaifu2xError Save(const boost::filesystem::path &output_file, const boost::optional<int> &output_quality);
};