Seam Estimation
===============

.. highlight:: cpp

detail::SeamFinder
------------------
.. ocv:class:: detail::SeamFinder

Base class for a seam estimator. ::

    class CV_EXPORTS SeamFinder
    {
    public:
        virtual ~SeamFinder() {}
        virtual void find(const std::vector<Mat> &src, const std::vector<Point> &corners,
                          std::vector<Mat> &masks) = 0;
    };

detail::SeamFinder::find
------------------------

Estimates seams.

.. ocv:function:: void detail::SeamFinder::find(const std::vector<UMat> &src, const std::vector<Point> &corners, std::vector<UMat> &masks)

    :param src: Source images

    :param corners: Source image top-left corners

    :param masks: Source image masks to update


detail::NoSeamFinder
--------------------
.. ocv:class:: detail::NoSeamFinder : public detail::SeamFinder

Stub seam estimator which does nothing. ::

    class CV_EXPORTS NoSeamFinder : public SeamFinder
    {
    public:
        void find(const std::vector<Mat>&, const std::vector<Point>&, std::vector<Mat>&) {}
    };

.. seealso:: :ocv:class:`detail::SeamFinder`

detail::PairwiseSeamFinder
--------------------------
.. ocv:class:: detail::PairwiseSeamFinder : public detail::SeamFinder

Base class for all pairwise seam estimators. ::

    class CV_EXPORTS PairwiseSeamFinder : public SeamFinder
    {
    public:
        virtual void find(const std::vector<Mat> &src, const std::vector<Point> &corners,
                          std::vector<Mat> &masks);

    protected:
        void run();
        virtual void findInPair(size_t first, size_t second, Rect roi) = 0;

        std::vector<Mat> images_;
        std::vector<Size> sizes_;
        std::vector<Point> corners_;
        std::vector<Mat> masks_;
    };

.. seealso:: :ocv:class:`detail::SeamFinder`

detail::PairwiseSeamFinder::findInPair
--------------------------------------

Resolves masks intersection of two specified images in the given ROI.

.. ocv:function:: void detail::PairwiseSeamFinder::findInPair(size_t first, size_t second, Rect roi)

    :param first: First image index

    :param second: Second image index

    :param roi: Region of interest

detail::VoronoiSeamFinder
-------------------------
.. ocv:class:: detail::VoronoiSeamFinder : public detail::PairwiseSeamFinder

Voronoi diagram-based seam estimator. ::

    class CV_EXPORTS VoronoiSeamFinder : public PairwiseSeamFinder
    {
    public:
        virtual void find(const std::vector<Size> &size, const std::vector<Point> &corners,
                          std::vector<Mat> &masks);
    private:
        void findInPair(size_t first, size_t second, Rect roi);
    };

.. seealso:: :ocv:class:`detail::PairwiseSeamFinder`

detail::GraphCutSeamFinderBase
------------------------------
.. ocv:class:: detail::GraphCutSeamFinderBase

Base class for all minimum graph-cut-based seam estimators. ::

    class CV_EXPORTS GraphCutSeamFinderBase
    {
    public:
        enum { COST_COLOR, COST_COLOR_GRAD };
    };

detail::GraphCutSeamFinder
--------------------------
.. ocv:class:: detail::GraphCutSeamFinder : public detail::GraphCutSeamFinderBase, public detail::SeamFinder

Minimum graph cut-based seam estimator. See details in [V03]_. ::

    class CV_EXPORTS GraphCutSeamFinder : public GraphCutSeamFinderBase, public SeamFinder
    {
    public:
        GraphCutSeamFinder(int cost_type = COST_COLOR_GRAD, float terminal_cost = 10000.f,
                           float bad_region_penalty = 1000.f);

        void find(const std::vector<Mat> &src, const std::vector<Point> &corners,
                  std::vector<Mat> &masks);

    private:
        /* hidden */
    };

.. seealso::
    :ocv:class:`detail::GraphCutSeamFinderBase`,
    :ocv:class:`detail::SeamFinder`
