13#include <opencv2/opencv.hpp>
38 FilterConfig(std::set<FilterType> f,
int sat_level, std::vector<int> bp)
81 : filename_ptr(std::make_shared<std::
string>(std::move(filename))),
85 Image2D(
const cv::Mat& mat,
const std::string& name =
"in_memory")
86 : filename_ptr(std::make_shared<std::string>(name)),
87 mat_ptr(std::make_shared<cv::Mat>(mat.clone())),
91 Image2D(cv::Mat&& mat,
const std::string& name =
"in_memory")
92 : filename_ptr(std::make_shared<std::string>(name)),
93 mat_ptr(std::make_shared<cv::Mat>(std::move(mat))),
98 : filename_ptr(std::make_shared<std::string>(name)),
99 gs_ptr(std::make_shared<
Array2D<double>>(gs_array)),
104 : filename_ptr(std::make_shared<std::string>(name)),
105 gs_ptr(std::make_shared<
Array2D<double>>(std::move(gs_array))),
113 const std::string& name =
"in_memory",
137 std::shared_ptr<std::string> filename_ptr;
138 std::shared_ptr<cv::Mat> mat_ptr;
139 std::shared_ptr<Array2D<double>> gs_ptr;
149 static cv::Mat
saturate(
const cv::Mat& input,
int level = 200);
150 static cv::Mat
apply_bandpass_filter(
const cv::Mat& input,
const std::vector<int>& params = {5, 50});
154 static std::vector<cv::Mat>
saturate(
const std::vector<cv::Mat>& input,
int level = 200);
156 const std::vector<int>& params = {5, 50});
157 static std::vector<cv::Mat>
apply_filters(
const std::vector<cv::Mat>& input,
const FilterConfig& config);
160 static std::pair<std::vector<cv::Mat>, std::pair<double, double>>
163 const std::vector<int>& params = {5, 50},
164 const std::pair<double, double>* gs_boundaries =
nullptr);
168 const std::vector<int>& params = {5, 50},
169 const std::pair<double, double>* gs_boundaries =
nullptr);
174 double lower_pct = 5.0,
double upper_pct = 95.0);
175 static cv::Mat
normalize_and_clamp(
const cv::Mat& image,
const std::pair<double, double>& boundaries);
189 const std::string& video_path,
192 const std::string& name_prefix =
"frame");
196 const std::string& video_path,
197 const std::string& output_dir,
200 const std::string& name_prefix =
"frame");
210 static std::optional<VideoInfo>
get_video_info(
const std::string& video_path);
213 static cv::Mat extract_grayscale_frame(
const cv::Mat& frame,
bool use_red_channel);
friend void imshow(const Image2D &, difference_type delay)
Image2D(Array2D< double > &&gs_array, const std::string &name="in_memory_gs")
bool save_to_file(const std::string &filename) const
static Image2D load(std::ifstream &)
friend bool isequal(const Image2D &, const Image2D &)
StorageMode get_storage_mode() const
Image2D(const Image2D &)=default
static Image2D from_mat(const cv::Mat &mat, const std::string &name="in_memory", const FilterConfig &filter_config=FilterConfig())
static Image2D from_file_filtered(const std::string &filename, const FilterConfig &filter_config)
Image2D(const cv::Mat &mat, const std::string &name="in_memory")
friend void save(const Image2D &, std::ofstream &)
Image2D(Image2D &&) noexcept=default
Image2D(cv::Mat &&mat, const std::string &name="in_memory")
friend std::ostream & operator<<(std::ostream &, const Image2D &)
Image2D(const Array2D< double > &gs_array, const std::string &name="in_memory_gs")
bool is_in_memory() const
std::ptrdiff_t difference_type
Array2D< double > get_gs() const
std::string get_filename() const
static cv::Mat normalize_and_clamp(const cv::Mat &image, const std::pair< double, double > &boundaries)
static cv::Mat filter_like_ben_single(const cv::Mat &input, const cv::Mat &mask, const std::vector< int > ¶ms={5, 50}, const std::pair< double, double > *gs_boundaries=nullptr)
static cv::Mat apply_bandpass_filter(const cv::Mat &input, const std::vector< int > ¶ms={5, 50})
static std::pair< std::vector< cv::Mat >, std::pair< double, double > > filter_like_ben(const std::vector< cv::Mat > &input, const cv::Mat &mask, const std::vector< int > ¶ms={5, 50}, const std::pair< double, double > *gs_boundaries=nullptr)
static cv::Mat saturate(const cv::Mat &input, int level=200)
static Array2D< double > mat_to_array2d(const cv::Mat &mat)
std::ptrdiff_t difference_type
static std::pair< double, double > compute_grayscale_boundaries(const cv::Mat &image, const cv::Mat &mask)
static std::pair< double, double > compute_percentile_boundaries(const cv::Mat &image, const cv::Mat &mask, double lower_pct=5.0, double upper_pct=95.0)
static cv::Mat apply_filters(const cv::Mat &input, const FilterConfig &config)
static cv::Mat array2d_to_mat(const Array2D< double > &arr)
static std::optional< VideoInfo > get_video_info(const std::string &video_path)
static std::vector< Image2D > import_video_to_files(const std::string &video_path, const std::string &output_dir, const VideoImportParams ¶ms=VideoImportParams(), const FilterConfig &filter_config=FilterConfig(), const std::string &name_prefix="frame")
static std::vector< Image2D > import_video(const std::string &video_path, const VideoImportParams ¶ms=VideoImportParams(), const FilterConfig &filter_config=FilterConfig(), const std::string &name_prefix="frame")
std::ptrdiff_t difference_type
std::set< FilterType > filters
std::vector< int > bandpass_params
FilterConfig(std::set< FilterType > f, int sat_level, std::vector< int > bp)
FilterConfig(std::set< FilterType > f, int sat_level)
bool has_saturation() const
FilterConfig(std::set< FilterType > f)
bool has_bandpass() const
VideoImportParams()=default
VideoImportParams(int start, int end, int jump)