Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
O
opencv
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
opencv
Commits
a39bce20
Commit
a39bce20
authored
Aug 02, 2012
by
alexey.spizhevoy
Committed by
Alexey Spizhevoy
Aug 07, 2012
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
implemented DP-based seam estimation method
parent
cd58b7e1
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
116 additions
and
1 deletion
+116
-1
seam_finders.hpp
...itching/include/opencv2/stitching/detail/seam_finders.hpp
+109
-0
seam_finders.cpp
modules/stitching/src/seam_finders.cpp
+0
-0
stitching_detailed.cpp
samples/cpp/stitching_detailed.cpp
+7
-1
No files found.
modules/stitching/include/opencv2/stitching/detail/seam_finders.hpp
View file @
a39bce20
...
...
@@ -43,6 +43,7 @@
#ifndef __OPENCV_STITCHING_SEAM_FINDERS_HPP__
#define __OPENCV_STITCHING_SEAM_FINDERS_HPP__
#include <set>
#include "opencv2/core/core.hpp"
#include "opencv2/opencv_modules.hpp"
...
...
@@ -92,6 +93,114 @@ private:
};
class
CV_EXPORTS
DpSeamFinder
:
public
SeamFinder
{
public
:
enum
CostFunction
{
COLOR
,
COLOR_GRAD
};
DpSeamFinder
(
CostFunction
costFunc
=
COLOR_GRAD
);
CostFunction
costFunction
()
const
{
return
costFunc_
;
}
void
setCostFunction
(
CostFunction
val
)
{
costFunc_
=
val
;
}
private
:
enum
ComponentState
{
FIRST
=
1
,
SECOND
=
2
,
INTERS
=
4
,
INTERS_FIRST
=
INTERS
|
FIRST
,
INTERS_SECOND
=
INTERS
|
SECOND
};
class
ImagePairLess
{
public
:
ImagePairLess
(
const
std
::
vector
<
Mat
>
&
images
,
const
std
::
vector
<
Point
>
&
corners
)
:
src_
(
&
images
[
0
]),
corners_
(
&
corners
[
0
])
{}
bool
operator
()
(
const
std
::
pair
<
int
,
int
>
&
l
,
const
std
::
pair
<
int
,
int
>
&
r
)
const
{
Point
c1
=
corners_
[
l
.
first
]
+
Point
(
src_
[
l
.
first
].
cols
/
2
,
src_
[
l
.
first
].
rows
/
2
);
Point
c2
=
corners_
[
l
.
second
]
+
Point
(
src_
[
l
.
second
].
cols
/
2
,
src_
[
l
.
second
].
rows
/
2
);
int
d1
=
(
c1
-
c2
).
dot
(
c1
-
c2
);
c1
=
corners_
[
r
.
first
]
+
Point
(
src_
[
r
.
first
].
cols
/
2
,
src_
[
r
.
first
].
rows
/
2
);
c2
=
corners_
[
r
.
second
]
+
Point
(
src_
[
r
.
second
].
cols
/
2
,
src_
[
r
.
second
].
rows
/
2
);
int
d2
=
(
c1
-
c2
).
dot
(
c1
-
c2
);
return
d1
<
d2
;
}
private
:
const
Mat
*
src_
;
const
Point
*
corners_
;
};
class
ClosePoints
{
public
:
ClosePoints
(
int
minDist
)
:
minDist_
(
minDist
)
{}
bool
operator
()
(
const
Point
&
p1
,
const
Point
&
p2
)
const
{
int
dist2
=
(
p1
.
x
-
p2
.
x
)
*
(
p1
.
x
-
p2
.
x
)
+
(
p1
.
y
-
p2
.
y
)
*
(
p1
.
y
-
p2
.
y
);
return
dist2
<
minDist_
*
minDist_
;
}
private
:
int
minDist_
;
};
virtual
void
find
(
const
std
::
vector
<
Mat
>
&
src
,
const
std
::
vector
<
Point
>
&
corners
,
std
::
vector
<
Mat
>
&
masks
);
void
process
(
const
Mat
&
image1
,
const
Mat
&
image2
,
Point
tl1
,
Point
tl2
,
Mat
&
mask1
,
Mat
&
mask2
);
void
findComponents
();
void
findEdges
();
void
resolveConflicts
(
const
Mat
&
image1
,
const
Mat
&
image2
,
Point
tl1
,
Point
tl2
,
Mat
&
mask1
,
Mat
&
mask2
);
void
computeGradients
(
const
Mat
&
image1
,
const
Mat
&
image2
);
bool
hasOnlyOneNeighbor
(
int
c
);
bool
closeToContour
(
int
y
,
int
x
,
const
Mat_
<
uchar
>
&
contourMask
);
bool
getSeamTips
(
int
c1
,
int
c2
,
Point
&
p1
,
Point
&
p2
);
void
computeCosts
(
const
Mat
&
image1
,
const
Mat
&
image2
,
Point
tl1
,
Point
tl2
,
int
c
,
Mat_
<
float
>
&
costV
,
Mat_
<
float
>
&
costH
);
bool
estimateSeam
(
const
Mat
&
image1
,
const
Mat
&
image2
,
Point
tl1
,
Point
tl2
,
int
c
,
Point
p1
,
Point
p2
,
std
::
vector
<
Point
>
&
seam
,
bool
&
isHorizontal
);
void
updateLabelsUsingSeam
(
int
c1
,
int
c2
,
const
std
::
vector
<
Point
>
&
seam
,
bool
isHorizontalSeam
);
CostFunction
costFunc_
;
// processing images pair data
Point
unionTl_
,
unionBr_
;
Size
unionSize_
;
Mat_
<
uchar
>
mask1_
,
mask2_
;
Mat_
<
uchar
>
contour1mask_
,
contour2mask_
;
Mat_
<
float
>
gradx1_
,
grady1_
;
Mat_
<
float
>
gradx2_
,
grady2_
;
// components data
int
ncomps_
;
Mat_
<
int
>
labels_
;
std
::
vector
<
ComponentState
>
states_
;
std
::
vector
<
Point
>
tls_
,
brs_
;
std
::
vector
<
std
::
vector
<
Point
>
>
contours_
;
std
::
set
<
std
::
pair
<
int
,
int
>
>
edges_
;
};
class
CV_EXPORTS
GraphCutSeamFinderBase
{
public
:
...
...
modules/stitching/src/seam_finders.cpp
View file @
a39bce20
This diff is collapsed.
Click to expand it.
samples/cpp/stitching_detailed.cpp
View file @
a39bce20
...
...
@@ -276,7 +276,9 @@ static int parseCmdArgs(int argc, char** argv)
if
(
string
(
argv
[
i
+
1
])
==
"no"
||
string
(
argv
[
i
+
1
])
==
"voronoi"
||
string
(
argv
[
i
+
1
])
==
"gc_color"
||
string
(
argv
[
i
+
1
])
==
"gc_colorgrad"
)
string
(
argv
[
i
+
1
])
==
"gc_colorgrad"
||
string
(
argv
[
i
+
1
])
==
"dp_color"
||
string
(
argv
[
i
+
1
])
==
"dp_colorgrad"
)
seam_find_type
=
argv
[
i
+
1
];
else
{
...
...
@@ -612,6 +614,10 @@ int main(int argc, char* argv[])
#endif
seam_finder
=
new
detail
::
GraphCutSeamFinder
(
GraphCutSeamFinderBase
::
COST_COLOR_GRAD
);
}
else
if
(
seam_find_type
==
"dp_color"
)
seam_finder
=
new
detail
::
DpSeamFinder
(
DpSeamFinder
::
COLOR
);
else
if
(
seam_find_type
==
"dp_colorgrad"
)
seam_finder
=
new
detail
::
DpSeamFinder
(
DpSeamFinder
::
COLOR_GRAD
);
if
(
seam_finder
.
empty
())
{
cout
<<
"Can't create the following seam finder '"
<<
seam_find_type
<<
"'
\n
"
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment