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
a41ac8fd
Commit
a41ac8fd
authored
9 years ago
by
GilLevi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
added sample code for LATCH
parent
6cb93445
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
91 additions
and
0 deletions
+91
-0
LATCH_match.cpp
samples/cpp/tutorial_code/xfeatures2D/LATCH_match.cpp
+91
-0
No files found.
samples/cpp/tutorial_code/xfeatures2D/LATCH_match.cpp
0 → 100644
View file @
a41ac8fd
#include <opencv2/features2d.hpp>
#include <opencv2/xfeatures2d.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/opencv.hpp>
#include <vector>
#include <iostream>
// If you find this code useful, please add a reference to the following paper in your work:
// Gil Levi and Tal Hassner, "LATCH: Learned Arrangements of Three Patch Codes", arXiv preprint arXiv:1501.03719, 15 Jan. 2015
using
namespace
std
;
using
namespace
cv
;
const
float
inlier_threshold
=
2.5
f
;
// Distance threshold to identify inliers
const
float
nn_match_ratio
=
0.8
f
;
// Nearest neighbor matching ratio
int
main
(
void
)
{
Mat
img1
=
imread
(
"../data/graf1.png"
,
IMREAD_GRAYSCALE
);
Mat
img2
=
imread
(
"../data/graf3.png"
,
IMREAD_GRAYSCALE
);
Mat
homography
;
FileStorage
fs
(
"../data/H1to3p.xml"
,
FileStorage
::
READ
);
fs
.
getFirstTopLevelNode
()
>>
homography
;
vector
<
KeyPoint
>
kpts1
,
kpts2
;
Mat
desc1
,
desc2
;
Ptr
<
cv
::
ORB
>
orb_detector
=
cv
::
ORB
::
create
(
10000
);
Ptr
<
xfeatures2d
::
LATCHDescriptorExtractor
>
latch
=
xfeatures2d
::
LATCHDescriptorExtractor
::
create
();
orb_detector
->
detect
(
img1
,
kpts1
);
latch
->
compute
(
img1
,
kpts1
,
desc1
);
orb_detector
->
detect
(
img2
,
kpts2
);
latch
->
compute
(
img2
,
kpts2
,
desc2
);
BFMatcher
matcher
(
NORM_HAMMING
);
vector
<
vector
<
DMatch
>
>
nn_matches
;
matcher
.
knnMatch
(
desc1
,
desc2
,
nn_matches
,
2
);
vector
<
KeyPoint
>
matched1
,
matched2
,
inliers1
,
inliers2
;
vector
<
DMatch
>
good_matches
;
for
(
size_t
i
=
0
;
i
<
nn_matches
.
size
();
i
++
)
{
DMatch
first
=
nn_matches
[
i
][
0
];
float
dist1
=
nn_matches
[
i
][
0
].
distance
;
float
dist2
=
nn_matches
[
i
][
1
].
distance
;
if
(
dist1
<
nn_match_ratio
*
dist2
)
{
matched1
.
push_back
(
kpts1
[
first
.
queryIdx
]);
matched2
.
push_back
(
kpts2
[
first
.
trainIdx
]);
}
}
for
(
unsigned
i
=
0
;
i
<
matched1
.
size
();
i
++
)
{
Mat
col
=
Mat
::
ones
(
3
,
1
,
CV_64F
);
col
.
at
<
double
>
(
0
)
=
matched1
[
i
].
pt
.
x
;
col
.
at
<
double
>
(
1
)
=
matched1
[
i
].
pt
.
y
;
col
=
homography
*
col
;
col
/=
col
.
at
<
double
>
(
2
);
double
dist
=
sqrt
(
pow
(
col
.
at
<
double
>
(
0
)
-
matched2
[
i
].
pt
.
x
,
2
)
+
pow
(
col
.
at
<
double
>
(
1
)
-
matched2
[
i
].
pt
.
y
,
2
));
if
(
dist
<
inlier_threshold
)
{
int
new_i
=
static_cast
<
int
>
(
inliers1
.
size
());
inliers1
.
push_back
(
matched1
[
i
]);
inliers2
.
push_back
(
matched2
[
i
]);
good_matches
.
push_back
(
DMatch
(
new_i
,
new_i
,
0
));
}
}
Mat
res
;
drawMatches
(
img1
,
inliers1
,
img2
,
inliers2
,
good_matches
,
res
);
imwrite
(
"../../samples/data/latch_res.png"
,
res
);
double
inlier_ratio
=
inliers1
.
size
()
*
1.0
/
matched1
.
size
();
cout
<<
"LATCH Matching Results"
<<
endl
;
cout
<<
"*******************************"
<<
endl
;
cout
<<
"# Keypoints 1:
\t
"
<<
kpts1
.
size
()
<<
endl
;
cout
<<
"# Keypoints 2:
\t
"
<<
kpts2
.
size
()
<<
endl
;
cout
<<
"# Matches:
\t
"
<<
matched1
.
size
()
<<
endl
;
cout
<<
"# Inliers:
\t
"
<<
inliers1
.
size
()
<<
endl
;
cout
<<
"# Inliers Ratio:
\t
"
<<
inlier_ratio
<<
endl
;
cout
<<
endl
;
return
0
;
}
This diff is collapsed.
Click to expand it.
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