#ifndef __OPENCV_SEAM_FINDERS_HPP__ #define __OPENCV_SEAM_FINDERS_HPP__ #include #include class SeamFinder { public: enum { NO, VORONOI, GRAPH_CUT }; static cv::Ptr createDefault(int type); virtual ~SeamFinder() {} void operator ()(const std::vector &src, const std::vector &corners, std::vector &masks); protected: virtual void find(const std::vector &src, const std::vector &corners, std::vector &masks) = 0; }; class NoSeamFinder : public SeamFinder { protected: void find(const std::vector&, const std::vector&, std::vector&) {} }; class PairwiseSeamFinder : public SeamFinder { protected: void find(const std::vector &src, const std::vector &corners, std::vector &masks); 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; }; class VoronoiSeamFinder : public PairwiseSeamFinder { private: 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); }; class GraphCutSeamFinder : public PairwiseSeamFinder { 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); private: 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); class Impl; cv::Ptr impl_; }; #endif // __OPENCV_SEAM_FINDERS_HPP__