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
createOneElemSets(int n)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
findSetByElem(int elem)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
mergeSets(int set1,int set2)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
addEdge(int from,int to,float weight)95 void Graph::addEdge(int from, int to, float weight)
96 {
97 edges_[from].push_back(GraphEdge(from, to, weight));
98 }
99
100
overlapRoi(Point tl1,Point tl2,Size sz1,Size sz2,Rect & roi)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
resultRoi(const std::vector<Point> & corners,const std::vector<UMat> & images)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
resultRoi(const std::vector<Point> & corners,const std::vector<Size> & sizes)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
resultRoiIntersection(const std::vector<Point> & corners,const std::vector<Size> & sizes)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
resultTl(const std::vector<Point> & corners)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
selectRandomSubset(int count,int size,std::vector<int> & subset)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
stitchingLogLevel()181 int& stitchingLogLevel()
182 {
183 static int _log_level=1;
184 return _log_level;
185 }
186
187 } // namespace detail
188 } // namespace cv
189