123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359 |
- #ifndef OPENCV_STITCHING_MOTION_ESTIMATORS_HPP
- #define OPENCV_STITCHING_MOTION_ESTIMATORS_HPP
- #include "opencv2/core.hpp"
- #include "matchers.hpp"
- #include "util.hpp"
- #include "camera.hpp"
- namespace cv {
- namespace detail {
- class CV_EXPORTS Estimator
- {
- public:
- virtual ~Estimator() {}
-
- bool operator ()(const std::vector<ImageFeatures> &features,
- const std::vector<MatchesInfo> &pairwise_matches,
- std::vector<CameraParams> &cameras)
- { return estimate(features, pairwise_matches, cameras); }
- protected:
-
- virtual bool estimate(const std::vector<ImageFeatures> &features,
- const std::vector<MatchesInfo> &pairwise_matches,
- std::vector<CameraParams> &cameras) = 0;
- };
- class CV_EXPORTS HomographyBasedEstimator : public Estimator
- {
- public:
- HomographyBasedEstimator(bool is_focals_estimated = false)
- : is_focals_estimated_(is_focals_estimated) {}
- private:
- virtual bool estimate(const std::vector<ImageFeatures> &features,
- const std::vector<MatchesInfo> &pairwise_matches,
- std::vector<CameraParams> &cameras);
- bool is_focals_estimated_;
- };
- class CV_EXPORTS AffineBasedEstimator : public Estimator
- {
- private:
- virtual bool estimate(const std::vector<ImageFeatures> &features,
- const std::vector<MatchesInfo> &pairwise_matches,
- std::vector<CameraParams> &cameras);
- };
- class CV_EXPORTS BundleAdjusterBase : public Estimator
- {
- public:
- const Mat refinementMask() const { return refinement_mask_.clone(); }
- void setRefinementMask(const Mat &mask)
- {
- CV_Assert(mask.type() == CV_8U && mask.size() == Size(3, 3));
- refinement_mask_ = mask.clone();
- }
- double confThresh() const { return conf_thresh_; }
- void setConfThresh(double conf_thresh) { conf_thresh_ = conf_thresh; }
- TermCriteria termCriteria() { return term_criteria_; }
- void setTermCriteria(const TermCriteria& term_criteria) { term_criteria_ = term_criteria; }
- protected:
-
- BundleAdjusterBase(int num_params_per_cam, int num_errs_per_measurement)
- : num_images_(0), total_num_matches_(0),
- num_params_per_cam_(num_params_per_cam),
- num_errs_per_measurement_(num_errs_per_measurement),
- features_(0), pairwise_matches_(0), conf_thresh_(0)
- {
- setRefinementMask(Mat::ones(3, 3, CV_8U));
- setConfThresh(1.);
- setTermCriteria(TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 1000, DBL_EPSILON));
- }
-
- virtual bool estimate(const std::vector<ImageFeatures> &features,
- const std::vector<MatchesInfo> &pairwise_matches,
- std::vector<CameraParams> &cameras);
-
- virtual void setUpInitialCameraParams(const std::vector<CameraParams> &cameras) = 0;
-
- virtual void obtainRefinedCameraParams(std::vector<CameraParams> &cameras) const = 0;
-
- virtual void calcError(Mat &err) = 0;
-
- virtual void calcJacobian(Mat &jac) = 0;
-
- Mat refinement_mask_;
- int num_images_;
- int total_num_matches_;
- int num_params_per_cam_;
- int num_errs_per_measurement_;
- const ImageFeatures *features_;
- const MatchesInfo *pairwise_matches_;
-
- double conf_thresh_;
-
- TermCriteria term_criteria_;
-
- Mat cam_params_;
-
- std::vector<std::pair<int,int> > edges_;
- };
- class CV_EXPORTS NoBundleAdjuster : public BundleAdjusterBase
- {
- public:
- NoBundleAdjuster() : BundleAdjusterBase(0, 0) {}
- private:
- bool estimate(const std::vector<ImageFeatures> &, const std::vector<MatchesInfo> &,
- std::vector<CameraParams> &)
- {
- return true;
- }
- void setUpInitialCameraParams(const std::vector<CameraParams> &) {}
- void obtainRefinedCameraParams(std::vector<CameraParams> &) const {}
- void calcError(Mat &) {}
- void calcJacobian(Mat &) {}
- };
- class CV_EXPORTS BundleAdjusterReproj : public BundleAdjusterBase
- {
- public:
- BundleAdjusterReproj() : BundleAdjusterBase(7, 2) {}
- private:
- void setUpInitialCameraParams(const std::vector<CameraParams> &cameras);
- void obtainRefinedCameraParams(std::vector<CameraParams> &cameras) const;
- void calcError(Mat &err);
- void calcJacobian(Mat &jac);
- Mat err1_, err2_;
- };
- class CV_EXPORTS BundleAdjusterRay : public BundleAdjusterBase
- {
- public:
- BundleAdjusterRay() : BundleAdjusterBase(4, 3) {}
- private:
- void setUpInitialCameraParams(const std::vector<CameraParams> &cameras);
- void obtainRefinedCameraParams(std::vector<CameraParams> &cameras) const;
- void calcError(Mat &err);
- void calcJacobian(Mat &jac);
- Mat err1_, err2_;
- };
- class CV_EXPORTS BundleAdjusterAffine : public BundleAdjusterBase
- {
- public:
- BundleAdjusterAffine() : BundleAdjusterBase(6, 2) {}
- private:
- void setUpInitialCameraParams(const std::vector<CameraParams> &cameras);
- void obtainRefinedCameraParams(std::vector<CameraParams> &cameras) const;
- void calcError(Mat &err);
- void calcJacobian(Mat &jac);
- Mat err1_, err2_;
- };
- class CV_EXPORTS BundleAdjusterAffinePartial : public BundleAdjusterBase
- {
- public:
- BundleAdjusterAffinePartial() : BundleAdjusterBase(4, 2) {}
- private:
- void setUpInitialCameraParams(const std::vector<CameraParams> &cameras);
- void obtainRefinedCameraParams(std::vector<CameraParams> &cameras) const;
- void calcError(Mat &err);
- void calcJacobian(Mat &jac);
- Mat err1_, err2_;
- };
- enum WaveCorrectKind
- {
- WAVE_CORRECT_HORIZ,
- WAVE_CORRECT_VERT
- };
- void CV_EXPORTS waveCorrect(std::vector<Mat> &rmats, WaveCorrectKind kind);
- String CV_EXPORTS matchesGraphAsString(std::vector<String> &pathes, std::vector<MatchesInfo> &pairwise_matches,
- float conf_threshold);
- std::vector<int> CV_EXPORTS leaveBiggestComponent(
- std::vector<ImageFeatures> &features,
- std::vector<MatchesInfo> &pairwise_matches,
- float conf_threshold);
- void CV_EXPORTS findMaxSpanningTree(
- int num_images, const std::vector<MatchesInfo> &pairwise_matches,
- Graph &span_tree, std::vector<int> ¢ers);
- }
- }
- #endif
|