int blend_type = Blender::MULTI_BAND;\r
string result_name = "result.png";\r
\r
- double work_scale = -1, compose_scale = -1;\r
+ double work_scale = 1, compose_scale = 1;\r
bool is_work_scale_set = false, is_compose_scale_set = false;\r
\r
if (argc == 1)\r
Ptr<Warper> warper = Warper::createByCameraFocal(camera_focal, warp_type);\r
for (int i = 0; i < num_images; ++i)\r
{\r
- corners[i] = (*warper)(images[i], static_cast<float>(cameras[i].focal), cameras[i].R, \r
- images_warped[i]);\r
+ corners[i] = warper->warp(images[i], static_cast<float>(cameras[i].focal), cameras[i].R, \r
+ images_warped[i]);\r
sizes[i] = images_warped[i].size();\r
- (*warper)(masks[i], static_cast<float>(cameras[i].focal), cameras[i].R, masks_warped[i], \r
- INTER_NEAREST, BORDER_CONSTANT);\r
+ warper->warp(masks[i], static_cast<float>(cameras[i].focal), cameras[i].R, masks_warped[i], \r
+ INTER_NEAREST, BORDER_CONSTANT);\r
}\r
\r
vector<Mat> images_f(num_images);\r
LOGLN("Finding seams...");\r
t = getTickCount();\r
Ptr<SeamFinder> seam_finder = SeamFinder::createDefault(seam_find_type);\r
- (*seam_finder)(images_f, corners, masks_warped);\r
+ seam_finder->find(images_f, corners, masks_warped);\r
LOGLN("Finding seams, time: " << ((getTickCount() - t) / getTickFrequency()) << " sec");\r
\r
LOGLN("Blending images...");\r
}
-void SeamFinder::operator ()(const vector<Mat> &src, const vector<Point> &corners,
- vector<Mat> &masks)
-{
- find(src, corners, masks);
-}
-
-
void PairwiseSeamFinder::find(const vector<Mat> &src, const vector<Point> &corners,
vector<Mat> &masks)
{
{
public:
enum { NO, VORONOI, GRAPH_CUT };
-
static cv::Ptr<SeamFinder> createDefault(int type);
virtual ~SeamFinder() {}
-
- void operator ()(const std::vector<cv::Mat> &src, const std::vector<cv::Point> &corners,
- std::vector<cv::Mat> &masks);
-
-protected:
virtual void find(const std::vector<cv::Mat> &src, const std::vector<cv::Point> &corners,
std::vector<cv::Mat> &masks) = 0;
};
class NoSeamFinder : public SeamFinder
{
-protected:
+public:
void find(const std::vector<cv::Mat>&, const std::vector<cv::Point>&, std::vector<cv::Mat>&) {}
};
class PairwiseSeamFinder : public SeamFinder
{
-protected:
+public:
void find(const std::vector<cv::Mat> &src, const std::vector<cv::Point> &corners,
std::vector<cv::Mat> &masks);
-
+protected:
virtual void findInPair(const cv::Mat &img1, const cv::Mat &img2, cv::Point tl1, cv::Point tl2,
cv::Rect roi, cv::Mat &mask1, cv::Mat &mask2) = 0;
};
public:
// TODO add COST_COLOR_GRAD support
enum { COST_COLOR };
-
GraphCutSeamFinder(int cost_type = COST_COLOR, float terminal_cost = 10000.f,
float bad_region_penalty = 1000.f);
}
-void ProjectorBase::setCameraMatrix(const Mat &R)
+void ProjectorBase::setTransformation(const Mat &R)
{
CV_Assert(R.size() == Size(3, 3));
CV_Assert(R.type() == CV_32F);
}
-Point Warper::operator ()(const Mat &src, float focal, const Mat& R, Mat &dst,
- int interp_mode, int border_mode)
-{
- return warp(src, focal, R, dst, interp_mode, border_mode);
-}
-
-
void PlaneWarper::detectResultRoi(Point &dst_tl, Point &dst_br)
{
float tl_uf = numeric_limits<float>::max();
{
public:
enum { PLANE, CYLINDRICAL, SPHERICAL };
-
static cv::Ptr<Warper> createByCameraFocal(float focal, int type);
virtual ~Warper() {}
-
- cv::Point operator ()(const cv::Mat &src, float focal, const cv::Mat& R, cv::Mat &dst,
- int interp_mode = cv::INTER_LINEAR, int border_mode = cv::BORDER_REFLECT);
-
-protected:
virtual cv::Point warp(const cv::Mat &src, float focal, const cv::Mat& R, cv::Mat &dst,
- int interp_mode, int border_mode) = 0;
+ int interp_mode = cv::INTER_LINEAR, int border_mode = cv::BORDER_REFLECT) = 0;
};
struct ProjectorBase
{
- void setCameraMatrix(const cv::Mat& R);
+ void setTransformation(const cv::Mat& R);
cv::Size size;
float focal;
template <class P>
class WarperBase : public Warper
{
-protected:
+public:
cv::Point warp(const cv::Mat &src, float focal, const cv::Mat &R, cv::Mat &dst,
int interp_mode, int border_mode);
+protected:
// Detects ROI of the destination image. It's correct for any projection.
virtual void detectResultRoi(cv::Point &dst_tl, cv::Point &dst_br);
projector_.size = src.size();
projector_.focal = focal;
- projector_.setCameraMatrix(R);
+ projector_.setTransformation(R);
cv::Point dst_tl, dst_br;
detectResultRoi(dst_tl, dst_br);