Home | History | Annotate | Download | only in src
      1 /*M///////////////////////////////////////////////////////////////////////////////////////
      2 //
      3 //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
      4 //
      5 //  By downloading, copying, installing or using the software you agree to this license.
      6 //  If you do not agree to this license, do not download, install,
      7 //  copy or use the software.
      8 //
      9 //
     10 //                          License Agreement
     11 //                For Open Source Computer Vision Library
     12 //
     13 // Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
     14 // Copyright (C) 2009, Willow Garage Inc., all rights reserved.
     15 // Third party copyrights are property of their respective owners.
     16 //
     17 // Redistribution and use in source and binary forms, with or without modification,
     18 // are permitted provided that the following conditions are met:
     19 //
     20 //   * Redistribution's of source code must retain the above copyright notice,
     21 //     this list of conditions and the following disclaimer.
     22 //
     23 //   * Redistribution's in binary form must reproduce the above copyright notice,
     24 //     this list of conditions and the following disclaimer in the documentation
     25 //     and/or other materials provided with the distribution.
     26 //
     27 //   * The name of the copyright holders may not be used to endorse or promote products
     28 //     derived from this software without specific prior written permission.
     29 //
     30 // This software is provided by the copyright holders and contributors "as is" and
     31 // any express or implied warranties, including, but not limited to, the implied
     32 // warranties of merchantability and fitness for a particular purpose are disclaimed.
     33 // In no event shall the Intel Corporation or contributors be liable for any direct,
     34 // indirect, incidental, special, exemplary, or consequential damages
     35 // (including, but not limited to, procurement of substitute goods or services;
     36 // loss of use, data, or profits; or business interruption) however caused
     37 // and on any theory of liability, whether in contract, strict liability,
     38 // or tort (including negligence or otherwise) arising in any way out of
     39 // the use of this software, even if advised of the possibility of such damage.
     40 //
     41 //M*/
     42 
     43 #include "precomp.hpp"
     44 
     45 namespace cv {
     46 namespace detail {
     47 
     48 void DisjointSets::createOneElemSets(int n)
     49 {
     50     rank_.assign(n, 0);
     51     size.assign(n, 1);
     52     parent.resize(n);
     53     for (int i = 0; i < n; ++i)
     54         parent[i] = i;
     55 }
     56 
     57 
     58 int DisjointSets::findSetByElem(int elem)
     59 {
     60     int set = elem;
     61     while (set != parent[set])
     62         set = parent[set];
     63     int next;
     64     while (elem != parent[elem])
     65     {
     66         next = parent[elem];
     67         parent[elem] = set;
     68         elem = next;
     69     }
     70     return set;
     71 }
     72 
     73 
     74 int DisjointSets::mergeSets(int set1, int set2)
     75 {
     76     if (rank_[set1] < rank_[set2])
     77     {
     78         parent[set1] = set2;
     79         size[set2] += size[set1];
     80         return set2;
     81     }
     82     if (rank_[set2] < rank_[set1])
     83     {
     84         parent[set2] = set1;
     85         size[set1] += size[set2];
     86         return set1;
     87     }
     88     parent[set1] = set2;
     89     rank_[set2]++;
     90     size[set2] += size[set1];
     91     return set2;
     92 }
     93 
     94 
     95 void Graph::addEdge(int from, int to, float weight)
     96 {
     97     edges_[from].push_back(GraphEdge(from, to, weight));
     98 }
     99 
    100 
    101 bool overlapRoi(Point tl1, Point tl2, Size sz1, Size sz2, Rect &roi)
    102 {
    103     int x_tl = std::max(tl1.x, tl2.x);
    104     int y_tl = std::max(tl1.y, tl2.y);
    105     int x_br = std::min(tl1.x + sz1.width, tl2.x + sz2.width);
    106     int y_br = std::min(tl1.y + sz1.height, tl2.y + sz2.height);
    107     if (x_tl < x_br && y_tl < y_br)
    108     {
    109         roi = Rect(x_tl, y_tl, x_br - x_tl, y_br - y_tl);
    110         return true;
    111     }
    112     return false;
    113 }
    114 
    115 
    116 Rect resultRoi(const std::vector<Point> &corners, const std::vector<UMat> &images)
    117 {
    118     std::vector<Size> sizes(images.size());
    119     for (size_t i = 0; i < images.size(); ++i)
    120         sizes[i] = images[i].size();
    121     return resultRoi(corners, sizes);
    122 }
    123 
    124 
    125 Rect resultRoi(const std::vector<Point> &corners, const std::vector<Size> &sizes)
    126 {
    127     CV_Assert(sizes.size() == corners.size());
    128     Point tl(std::numeric_limits<int>::max(), std::numeric_limits<int>::max());
    129     Point br(std::numeric_limits<int>::min(), std::numeric_limits<int>::min());
    130     for (size_t i = 0; i < corners.size(); ++i)
    131     {
    132         tl.x = std::min(tl.x, corners[i].x);
    133         tl.y = std::min(tl.y, corners[i].y);
    134         br.x = std::max(br.x, corners[i].x + sizes[i].width);
    135         br.y = std::max(br.y, corners[i].y + sizes[i].height);
    136     }
    137     return Rect(tl, br);
    138 }
    139 
    140 Rect resultRoiIntersection(const std::vector<Point> &corners, const std::vector<Size> &sizes)
    141 {
    142     CV_Assert(sizes.size() == corners.size());
    143     Point tl(std::numeric_limits<int>::min(), std::numeric_limits<int>::min());
    144     Point br(std::numeric_limits<int>::max(), std::numeric_limits<int>::max());
    145     for (size_t i = 0; i < corners.size(); ++i)
    146     {
    147         tl.x = std::max(tl.x, corners[i].x);
    148         tl.y = std::max(tl.y, corners[i].y);
    149         br.x = std::min(br.x, corners[i].x + sizes[i].width);
    150         br.y = std::min(br.y, corners[i].y + sizes[i].height);
    151     }
    152     return Rect(tl, br);
    153 }
    154 
    155 
    156 Point resultTl(const std::vector<Point> &corners)
    157 {
    158     Point tl(std::numeric_limits<int>::max(), std::numeric_limits<int>::max());
    159     for (size_t i = 0; i < corners.size(); ++i)
    160     {
    161         tl.x = std::min(tl.x, corners[i].x);
    162         tl.y = std::min(tl.y, corners[i].y);
    163     }
    164     return tl;
    165 }
    166 
    167 
    168 void selectRandomSubset(int count, int size, std::vector<int> &subset)
    169 {
    170     subset.clear();
    171     for (int i = 0; i < size; ++i)
    172     {
    173         if (randu<int>() % (size - i) < count)
    174         {
    175             subset.push_back(i);
    176             count--;
    177         }
    178     }
    179 }
    180 
    181 int& stitchingLogLevel()
    182 {
    183     static int _log_level=1;
    184     return _log_level;
    185 }
    186 
    187 } // namespace detail
    188 } // namespace cv
    189