added gain compensation into opencv_stitching
This commit is contained in:
@@ -44,7 +44,8 @@
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
|
||||
void DjSets::create(int n) {
|
||||
void DjSets::create(int n)
|
||||
{
|
||||
rank_.assign(n, 0);
|
||||
size.assign(n, 1);
|
||||
parent.resize(n);
|
||||
@@ -53,12 +54,14 @@ void DjSets::create(int n) {
|
||||
}
|
||||
|
||||
|
||||
int DjSets::find(int elem) {
|
||||
int DjSets::find(int elem)
|
||||
{
|
||||
int set = elem;
|
||||
while (set != parent[set])
|
||||
set = parent[set];
|
||||
int next;
|
||||
while (elem != parent[elem]) {
|
||||
while (elem != parent[elem])
|
||||
{
|
||||
next = parent[elem];
|
||||
parent[elem] = set;
|
||||
elem = next;
|
||||
@@ -67,13 +70,16 @@ int DjSets::find(int elem) {
|
||||
}
|
||||
|
||||
|
||||
int DjSets::merge(int set1, int set2) {
|
||||
if (rank_[set1] < rank_[set2]) {
|
||||
int DjSets::merge(int set1, int set2)
|
||||
{
|
||||
if (rank_[set1] < rank_[set2])
|
||||
{
|
||||
parent[set1] = set2;
|
||||
size[set2] += size[set1];
|
||||
return set2;
|
||||
}
|
||||
if (rank_[set2] < rank_[set1]) {
|
||||
if (rank_[set2] < rank_[set1])
|
||||
{
|
||||
parent[set2] = set1;
|
||||
size[set1] += size[set2];
|
||||
return set1;
|
||||
@@ -89,3 +95,56 @@ void Graph::addEdge(int from, int to, float weight)
|
||||
{
|
||||
edges_[from].push_back(GraphEdge(from, to, weight));
|
||||
}
|
||||
|
||||
|
||||
bool overlapRoi(Point tl1, Point tl2, Size sz1, Size sz2, Rect &roi)
|
||||
{
|
||||
int x_tl = max(tl1.x, tl2.x);
|
||||
int y_tl = max(tl1.y, tl2.y);
|
||||
int x_br = min(tl1.x + sz1.width, tl2.x + sz2.width);
|
||||
int y_br = min(tl1.y + sz1.height, tl2.y + sz2.height);
|
||||
if (x_tl < x_br && y_tl < y_br)
|
||||
{
|
||||
roi = Rect(x_tl, y_tl, x_br - x_tl, y_br - y_tl);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
Rect resultRoi(const vector<Point> &corners, const vector<Mat> &images)
|
||||
{
|
||||
vector<Size> sizes(images.size());
|
||||
for (size_t i = 0; i < images.size(); ++i)
|
||||
sizes[i] = images[i].size();
|
||||
return resultRoi(corners, sizes);
|
||||
}
|
||||
|
||||
|
||||
Rect resultRoi(const vector<Point> &corners, const vector<Size> &sizes)
|
||||
{
|
||||
CV_Assert(sizes.size() == corners.size());
|
||||
Point tl(numeric_limits<int>::max(), numeric_limits<int>::max());
|
||||
Point br(numeric_limits<int>::min(), numeric_limits<int>::min());
|
||||
for (size_t i = 0; i < corners.size(); ++i)
|
||||
{
|
||||
tl.x = min(tl.x, corners[i].x);
|
||||
tl.y = min(tl.y, corners[i].y);
|
||||
br.x = max(br.x, corners[i].x + sizes[i].width);
|
||||
br.y = max(br.y, corners[i].y + sizes[i].height);
|
||||
}
|
||||
return Rect(tl, br);
|
||||
}
|
||||
|
||||
|
||||
Point resultTl(const vector<Point> &corners)
|
||||
{
|
||||
Point tl(numeric_limits<int>::max(), numeric_limits<int>::max());
|
||||
for (size_t i = 0; i < corners.size(); ++i)
|
||||
{
|
||||
tl.x = min(tl.x, corners[i].x);
|
||||
tl.y = min(tl.y, corners[i].y);
|
||||
}
|
||||
return tl;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user