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
9c413930
Commit
9c413930
authored
May 14, 2015
by
manuele
Committed by
Maksim Shabunin
Dec 17, 2015
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fixed docs and added tests for Linemod 16U depth case
parent
fc5be800
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
73 additions
and
8 deletions
+73
-8
rgbd.hpp
modules/rgbd/include/opencv2/rgbd.hpp
+2
-2
normal.cpp
modules/rgbd/src/normal.cpp
+3
-1
test_normal.cpp
modules/rgbd/test/test_normal.cpp
+68
-5
No files found.
modules/rgbd/include/opencv2/rgbd.hpp
View file @
9c413930
...
...
@@ -127,7 +127,7 @@ namespace rgbd
/** Constructor
* @param rows the number of rows of the depth image normals will be computed on
* @param cols the number of cols of the depth image normals will be computed on
* @param depth the depth of the normals (only CV_32F or CV_64F
for FALS and SRI, CV_16U for LINEMOD
)
* @param depth the depth of the normals (only CV_32F or CV_64F)
* @param K the calibration matrix to use
* @param window_size the window size to compute the normals: can only be 1,3,5 or 7
* @param method one of the methods to use: RGBD_NORMALS_METHOD_SRI, RGBD_NORMALS_METHOD_FALS
...
...
@@ -234,7 +234,7 @@ namespace rgbd
}
/** Constructor
* @param depth the depth of the normals (only CV_32F or CV_64F
for FALS and SRI, CV_16U for LINEMOD
)
* @param depth the depth of the normals (only CV_32F or CV_64F)
* @param window_size the window size to compute the normals: can only be 1,3,5 or 7
* @param method one of the methods to use: RGBD_NORMALS_METHOD_SRI, RGBD_NORMALS_METHOD_FALS
*/
...
...
modules/rgbd/src/normal.cpp
View file @
9c413930
...
...
@@ -38,7 +38,7 @@
namespace
cv
{
namespace
rgbd
{
{
/** Just compute the norm of a vector
* @param vec a vector of size 3 and any type T
* @return
...
...
@@ -133,6 +133,7 @@ namespace rgbd
res
=
-
normal_in
/
norm_vec
(
normal_in
);
else
res
=
normal_in
/
norm_vec
(
normal_in
);
normal_out
[
0
]
=
res
[
0
];
normal_out
[
1
]
=
res
[
1
];
normal_out
[
2
]
=
res
[
2
];
...
...
@@ -434,6 +435,7 @@ multiply_by_K_inv(const Matx<T, 3, 3> & K_inv, U a, U b, U c, Vec<T, 3> &res)
Vec3T
X1_minus_X
,
X2_minus_X
;
ContainerDepth
difference_threshold
=
50
;
normals
.
setTo
(
std
::
numeric_limits
<
DepthDepth
>::
quiet_NaN
());
for
(
int
y
=
r
;
y
<
rows_
-
r
-
1
;
++
y
)
{
const
DepthDepth
*
p_line
=
reinterpret_cast
<
const
DepthDepth
*>
(
depth
.
ptr
(
y
,
r
));
...
...
modules/rgbd/test/test_normal.cpp
View file @
9c413930
...
...
@@ -35,6 +35,7 @@
#include "test_precomp.hpp"
#include <opencv2/rgbd.hpp>
#include <opencv2/calib3d.hpp>
namespace
cv
{
...
...
@@ -77,7 +78,7 @@ void TickMeter::stop()
return
;
++
counter
;
sumTime
+=
(
time
-
startTime
);
startTime
=
0
;
}
...
...
@@ -129,6 +130,35 @@ float cy = H / 2.f + 0.5f;
Mat
K
=
(
Mat_
<
double
>
(
3
,
3
)
<<
focal_length
,
0
,
cx
,
0
,
focal_length
,
cy
,
0
,
0
,
1
);
Mat
Kinv
=
K
.
inv
();
void
points3dToDepth16U
(
const
Mat_
<
Vec3f
>&
points3d
,
Mat
&
depthMap
);
void
points3dToDepth16U
(
const
Mat_
<
Vec3f
>&
points3d
,
Mat
&
depthMap
)
{
std
::
vector
<
Point3f
>
points3dvec
;
for
(
int
i
=
0
;
i
<
H
;
i
++
)
for
(
int
j
=
0
;
j
<
W
;
j
++
)
points3dvec
.
push_back
(
Point3f
(
points3d
(
i
,
j
)[
0
],
points3d
(
i
,
j
)[
1
],
points3d
(
i
,
j
)[
2
]));
std
::
vector
<
Point2f
>
img_points
;
depthMap
=
Mat
::
zeros
(
H
,
W
,
CV_32F
);
Vec3f
R
(
0.0
,
0.0
,
0.0
);
Vec3f
T
(
0.0
,
0.0
,
0.0
);
cv
::
projectPoints
(
points3dvec
,
R
,
T
,
K
,
Mat
(),
img_points
);
int
index
=
0
;
for
(
int
i
=
0
;
i
<
H
;
i
++
)
{
for
(
int
j
=
0
;
j
<
W
;
j
++
)
{
float
value
=
(
points3d
.
at
<
Vec3f
>
(
i
,
j
))[
2
];
// value is the z
depthMap
.
at
<
float
>
(
cvRound
(
img_points
[
index
].
y
),
cvRound
(
img_points
[
index
].
x
))
=
value
;
index
++
;
}
}
depthMap
.
convertTo
(
depthMap
,
CV_16U
,
1000
);
}
static
RNG
rng
;
struct
Plane
{
...
...
@@ -224,8 +254,8 @@ protected:
// inner vector: whether it's 1 plane or 3 planes
// outer vector: float or double
std
::
vector
<
std
::
vector
<
float
>
>
errors
(
2
);
errors
[
0
].
resize
(
2
);
errors
[
1
].
resize
(
2
);
errors
[
0
].
resize
(
4
);
errors
[
1
].
resize
(
4
);
switch
(
i
)
{
case
0
:
...
...
@@ -241,8 +271,13 @@ protected:
std
::
cout
<<
std
::
endl
<<
"*** LINEMOD"
<<
std
::
endl
;
errors
[
0
][
0
]
=
0.04
f
;
errors
[
0
][
1
]
=
0.07
f
;
errors
[
0
][
2
]
=
0.04
f
;
// depth 16U 1 plane
errors
[
0
][
3
]
=
0.07
f
;
// depth 16U 3 planes
errors
[
1
][
0
]
=
0.05
f
;
errors
[
1
][
1
]
=
0.08
f
;
errors
[
1
][
2
]
=
0.05
f
;
// depth 16U 1 plane
errors
[
1
][
3
]
=
0.08
f
;
// depth 16U 3 planes
break
;
case
2
:
method
=
RgbdNormals
::
RGBD_NORMALS_METHOD_SRI
;
...
...
@@ -271,7 +306,7 @@ protected:
std
::
vector
<
Plane
>
plane_params
;
Mat
points3d
,
ground_normals
;
// 1 plane, continuous scene, very low error..
std
::
cout
<<
"1 plane"
<<
std
::
endl
;
std
::
cout
<<
"1 plane
- input 3d points
"
<<
std
::
endl
;
float
err_mean
=
0
;
for
(
int
ii
=
0
;
ii
<
5
;
++
ii
)
{
...
...
@@ -291,6 +326,34 @@ protected:
}
std
::
cout
<<
"mean diff: "
<<
(
err_mean
/
5
)
<<
std
::
endl
;
EXPECT_LE
(
err_mean
/
5
,
errors
[
j
][
1
])
<<
"mean diff: "
<<
(
err_mean
/
5
)
<<
" thresh: "
<<
errors
[
j
][
1
]
<<
std
::
endl
;
if
(
method
==
RgbdNormals
::
RGBD_NORMALS_METHOD_LINEMOD
)
{
// depth 16U test
std
::
cout
<<
"** depth 16U - 1 plane"
<<
std
::
endl
;
err_mean
=
0
;
for
(
int
ii
=
0
;
ii
<
5
;
++
ii
)
{
gen_points_3d
(
plane_params
,
plane_mask
,
points3d
,
ground_normals
,
1
);
Mat
depthMap
;
points3dToDepth16U
(
points3d
,
depthMap
);
err_mean
+=
testit
(
depthMap
,
ground_normals
,
normals_computer
);
}
std
::
cout
<<
"mean diff: "
<<
(
err_mean
/
5
)
<<
std
::
endl
;
EXPECT_LE
(
err_mean
/
5
,
errors
[
j
][
2
])
<<
" thresh: "
<<
errors
[
j
][
2
]
<<
std
::
endl
;
std
::
cout
<<
"** depth 16U - 3 plane"
<<
std
::
endl
;
err_mean
=
0
;
for
(
int
ii
=
0
;
ii
<
5
;
++
ii
)
{
gen_points_3d
(
plane_params
,
plane_mask
,
points3d
,
ground_normals
,
3
);
Mat
depthMap
;
points3dToDepth16U
(
points3d
,
depthMap
);
err_mean
+=
testit
(
depthMap
,
ground_normals
,
normals_computer
);
}
std
::
cout
<<
"mean diff: "
<<
(
err_mean
/
5
)
<<
std
::
endl
;
EXPECT_LE
(
err_mean
/
5
,
errors
[
j
][
3
])
<<
"mean diff: "
<<
(
err_mean
/
5
)
<<
" thresh: "
<<
errors
[
j
][
3
]
<<
std
::
endl
;
}
}
}
...
...
@@ -309,7 +372,7 @@ protected:
TickMeter
tm
;
tm
.
start
();
Mat
in_normals
;
if
(
normals_computer
.
getMethod
()
==
RgbdNormals
::
RGBD_NORMALS_METHOD_LINEMOD
)
if
(
normals_computer
.
getMethod
()
==
RgbdNormals
::
RGBD_NORMALS_METHOD_LINEMOD
&&
points3d
.
channels
()
==
3
)
{
std
::
vector
<
Mat
>
channels
;
split
(
points3d
,
channels
);
...
...
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