Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
O
opencv_contrib
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_contrib
Commits
4bc49c05
Commit
4bc49c05
authored
Sep 20, 2017
by
Vadim Pisarevsky
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1195 from woodychow:multithread_sift_findScaleSpaceExtrema
parents
b9541897
ab43a3b2
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
92 additions
and
20 deletions
+92
-20
sift.cpp
modules/xfeatures2d/src/sift.cpp
+92
-20
No files found.
modules/xfeatures2d/src/sift.cpp
View file @
4bc49c05
...
...
@@ -569,31 +569,53 @@ static bool adjustLocalExtrema( const std::vector<Mat>& dog_pyr, KeyPoint& kpt,
}
//
// Detects features at extrema in DoG scale space. Bad features are discarded
// based on contrast and ratio of principal curvatures.
void
SIFT_Impl
::
findScaleSpaceExtrema
(
const
std
::
vector
<
Mat
>&
gauss_pyr
,
const
std
::
vector
<
Mat
>&
dog_pyr
,
std
::
vector
<
KeyPoint
>&
keypoints
)
const
class
findScaleSpaceExtremaComputer
:
public
ParallelLoopBody
{
int
nOctaves
=
(
int
)
gauss_pyr
.
size
()
/
(
nOctaveLayers
+
3
);
int
threshold
=
cvFloor
(
0.5
*
contrastThreshold
/
nOctaveLayers
*
255
*
SIFT_FIXPT_SCALE
);
const
int
n
=
SIFT_ORI_HIST_BINS
;
float
hist
[
n
];
KeyPoint
kpt
;
public
:
findScaleSpaceExtremaComputer
(
int
_o
,
int
_i
,
int
_threshold
,
int
_idx
,
int
_step
,
int
_cols
,
int
_nOctaveLayers
,
double
_contrastThreshold
,
double
_edgeThreshold
,
double
_sigma
,
const
std
::
vector
<
Mat
>&
_gauss_pyr
,
const
std
::
vector
<
Mat
>&
_dog_pyr
,
TLSData
<
std
::
vector
<
KeyPoint
>
>
&
_tls_kpts_struct
)
:
o
(
_o
),
i
(
_i
),
threshold
(
_threshold
),
idx
(
_idx
),
step
(
_step
),
cols
(
_cols
),
nOctaveLayers
(
_nOctaveLayers
),
contrastThreshold
(
_contrastThreshold
),
edgeThreshold
(
_edgeThreshold
),
sigma
(
_sigma
),
gauss_pyr
(
_gauss_pyr
),
dog_pyr
(
_dog_pyr
),
tls_kpts_struct
(
_tls_kpts_struct
)
{
}
void
operator
()(
const
cv
::
Range
&
range
)
const
{
const
int
begin
=
range
.
start
;
const
int
end
=
range
.
end
;
keypoints
.
clear
();
static
const
int
n
=
SIFT_ORI_HIST_BINS
;
float
hist
[
n
];
for
(
int
o
=
0
;
o
<
nOctaves
;
o
++
)
for
(
int
i
=
1
;
i
<=
nOctaveLayers
;
i
++
)
{
int
idx
=
o
*
(
nOctaveLayers
+
2
)
+
i
;
const
Mat
&
img
=
dog_pyr
[
idx
];
const
Mat
&
prev
=
dog_pyr
[
idx
-
1
];
const
Mat
&
next
=
dog_pyr
[
idx
+
1
];
int
step
=
(
int
)
img
.
step1
();
int
rows
=
img
.
rows
,
cols
=
img
.
cols
;
for
(
int
r
=
SIFT_IMG_BORDER
;
r
<
rows
-
SIFT_IMG_BORDER
;
r
++
)
std
::
vector
<
KeyPoint
>
*
tls_kpts
=
tls_kpts_struct
.
get
();
KeyPoint
kpt
;
for
(
int
r
=
begin
;
r
<
end
;
r
++
)
{
const
sift_wt
*
currptr
=
img
.
ptr
<
sift_wt
>
(
r
);
const
sift_wt
*
prevptr
=
prev
.
ptr
<
sift_wt
>
(
r
);
...
...
@@ -648,12 +670,62 @@ void SIFT_Impl::findScaleSpaceExtrema( const std::vector<Mat>& gauss_pyr, const
kpt
.
angle
=
360.
f
-
(
float
)((
360.
f
/
n
)
*
bin
);
if
(
std
::
abs
(
kpt
.
angle
-
360.
f
)
<
FLT_EPSILON
)
kpt
.
angle
=
0.
f
;
keypoints
.
push_back
(
kpt
);
{
tls_kpts
->
push_back
(
kpt
);
}
}
}
}
}
}
}
private
:
int
o
,
i
;
int
threshold
;
int
idx
,
step
,
cols
;
int
nOctaveLayers
;
double
contrastThreshold
;
double
edgeThreshold
;
double
sigma
;
const
std
::
vector
<
Mat
>&
gauss_pyr
;
const
std
::
vector
<
Mat
>&
dog_pyr
;
TLSData
<
std
::
vector
<
KeyPoint
>
>
&
tls_kpts_struct
;
};
//
// Detects features at extrema in DoG scale space. Bad features are discarded
// based on contrast and ratio of principal curvatures.
void
SIFT_Impl
::
findScaleSpaceExtrema
(
const
std
::
vector
<
Mat
>&
gauss_pyr
,
const
std
::
vector
<
Mat
>&
dog_pyr
,
std
::
vector
<
KeyPoint
>&
keypoints
)
const
{
const
int
nOctaves
=
(
int
)
gauss_pyr
.
size
()
/
(
nOctaveLayers
+
3
);
const
int
threshold
=
cvFloor
(
0.5
*
contrastThreshold
/
nOctaveLayers
*
255
*
SIFT_FIXPT_SCALE
);
keypoints
.
clear
();
TLSData
<
std
::
vector
<
KeyPoint
>
>
tls_kpts_struct
;
for
(
int
o
=
0
;
o
<
nOctaves
;
o
++
)
for
(
int
i
=
1
;
i
<=
nOctaveLayers
;
i
++
)
{
const
int
idx
=
o
*
(
nOctaveLayers
+
2
)
+
i
;
const
Mat
&
img
=
dog_pyr
[
idx
];
const
int
step
=
(
int
)
img
.
step1
();
const
int
rows
=
img
.
rows
,
cols
=
img
.
cols
;
parallel_for_
(
Range
(
SIFT_IMG_BORDER
,
rows
-
SIFT_IMG_BORDER
),
findScaleSpaceExtremaComputer
(
o
,
i
,
threshold
,
idx
,
step
,
cols
,
nOctaveLayers
,
contrastThreshold
,
edgeThreshold
,
sigma
,
gauss_pyr
,
dog_pyr
,
tls_kpts_struct
));
}
std
::
vector
<
std
::
vector
<
KeyPoint
>*>
kpt_vecs
;
tls_kpts_struct
.
gather
(
kpt_vecs
);
for
(
size_t
i
=
0
;
i
<
kpt_vecs
.
size
();
++
i
)
{
keypoints
.
insert
(
keypoints
.
end
(),
kpt_vecs
[
i
]
->
begin
(),
kpt_vecs
[
i
]
->
end
());
}
}
...
...
@@ -1081,7 +1153,7 @@ void SIFT_Impl::detectAndCompute(InputArray _image, InputArray _mask,
{
//t = (double)getTickCount();
findScaleSpaceExtrema
(
gpyr
,
dogpyr
,
keypoints
);
KeyPointsFilter
::
removeDuplicated
(
keypoints
);
KeyPointsFilter
::
removeDuplicated
Sorted
(
keypoints
);
if
(
nfeatures
>
0
)
KeyPointsFilter
::
retainBest
(
keypoints
,
nfeatures
);
...
...
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