2011-05-05 20:12:32 +08:00
|
|
|
#ifndef __OPENCV_BLENDERS_HPP__
|
|
|
|
#define __OPENCV_BLENDERS_HPP__
|
2011-05-04 19:09:42 +08:00
|
|
|
|
|
|
|
#include <vector>
|
2011-05-22 02:32:34 +08:00
|
|
|
#include "opencv2/core/core.hpp"
|
2011-05-04 19:09:42 +08:00
|
|
|
|
|
|
|
// Simple blender which puts one image over another
|
|
|
|
class Blender
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
enum { NO, FEATHER, MULTI_BAND };
|
|
|
|
static cv::Ptr<Blender> createDefault(int type);
|
|
|
|
|
2011-05-21 19:09:47 +08:00
|
|
|
void prepare(const std::vector<cv::Point> &corners, const std::vector<cv::Size> &sizes);
|
|
|
|
virtual void prepare(cv::Rect dst_roi);
|
|
|
|
virtual void feed(const cv::Mat &img, const cv::Mat &mask, cv::Point tl);
|
|
|
|
virtual void blend(cv::Mat &dst, cv::Mat &dst_mask);
|
2011-05-04 19:09:42 +08:00
|
|
|
|
|
|
|
protected:
|
2011-05-21 19:09:47 +08:00
|
|
|
cv::Mat dst_, dst_mask_;
|
|
|
|
cv::Rect dst_roi_;
|
2011-05-04 19:09:42 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class FeatherBlender : public Blender
|
|
|
|
{
|
|
|
|
public:
|
2011-05-21 19:09:47 +08:00
|
|
|
FeatherBlender(float sharpness = 0.02f) { setSharpness(sharpness); }
|
|
|
|
float sharpness() const { return sharpness_; }
|
|
|
|
void setSharpness(float val) { sharpness_ = val; }
|
2011-05-04 19:09:42 +08:00
|
|
|
|
2011-05-21 19:09:47 +08:00
|
|
|
void prepare(cv::Rect dst_roi);
|
|
|
|
void feed(const cv::Mat &img, const cv::Mat &mask, cv::Point tl);
|
|
|
|
void blend(cv::Mat &dst, cv::Mat &dst_mask);
|
2011-05-04 19:09:42 +08:00
|
|
|
|
2011-05-21 19:09:47 +08:00
|
|
|
private:
|
2011-05-04 19:09:42 +08:00
|
|
|
float sharpness_;
|
2011-05-21 19:09:47 +08:00
|
|
|
cv::Mat weight_map_;
|
|
|
|
cv::Mat dst_weight_map_;
|
2011-05-04 19:09:42 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class MultiBandBlender : public Blender
|
|
|
|
{
|
|
|
|
public:
|
2011-05-21 22:44:37 +08:00
|
|
|
MultiBandBlender(int num_bands = 5) { setNumBands(num_bands); }
|
2011-05-20 15:44:37 +08:00
|
|
|
int numBands() const { return num_bands_; }
|
|
|
|
void setNumBands(int val) { num_bands_ = val; }
|
|
|
|
|
2011-05-21 19:09:47 +08:00
|
|
|
void prepare(cv::Rect dst_roi);
|
|
|
|
void feed(const cv::Mat &img, const cv::Mat &mask, cv::Point tl);
|
|
|
|
void blend(cv::Mat &dst, cv::Mat &dst_mask);
|
2011-05-04 19:09:42 +08:00
|
|
|
|
2011-05-21 19:09:47 +08:00
|
|
|
private:
|
2011-05-04 19:09:42 +08:00
|
|
|
int num_bands_;
|
2011-05-21 19:09:47 +08:00
|
|
|
std::vector<cv::Mat> dst_pyr_laplace_;
|
|
|
|
std::vector<cv::Mat> dst_band_weights_;
|
2011-05-04 19:09:42 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Auxiliary functions
|
|
|
|
|
2011-05-21 19:09:47 +08:00
|
|
|
cv::Rect resultRoi(const std::vector<cv::Point> &corners, const std::vector<cv::Size> &sizes);
|
2011-05-04 19:09:42 +08:00
|
|
|
|
2011-05-11 13:28:55 +08:00
|
|
|
void normalize(const cv::Mat& weight, cv::Mat& src);
|
|
|
|
|
2011-05-04 19:09:42 +08:00
|
|
|
void createWeightMap(const cv::Mat& mask, float sharpness, cv::Mat& weight);
|
|
|
|
|
|
|
|
void createLaplacePyr(const std::vector<cv::Mat>& pyr_gauss, std::vector<cv::Mat>& pyr_laplace);
|
|
|
|
|
2011-05-11 13:28:55 +08:00
|
|
|
// Restores source image in-place. Result will be stored in pyr[0].
|
2011-05-04 19:09:42 +08:00
|
|
|
void restoreImageFromLaplacePyr(std::vector<cv::Mat>& pyr);
|
|
|
|
|
2011-05-05 20:12:32 +08:00
|
|
|
#endif // __OPENCV_BLENDERS_HPP__
|