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
1767049f
Commit
1767049f
authored
Dec 21, 2011
by
Alexander Reshetnikov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fixed some errors in test data for eigen. Added test using lowindex & highindex in eigen function.
parent
ec7bc9e4
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
61 additions
and
15 deletions
+61
-15
test_eigen.cpp
modules/core/test/test_eigen.cpp
+61
-15
No files found.
modules/core/test/test_eigen.cpp
View file @
1767049f
...
...
@@ -3,6 +3,8 @@
using
namespace
cv
;
using
namespace
std
;
#define sign(a) a > 0 ? 1 : a < 0 ? 0 : -1
class
Core_EigenTest
:
public
cvtest
::
BaseTest
{
public
:
...
...
@@ -12,13 +14,12 @@ class Core_EigenTest: public cvtest::BaseTest
protected
:
void
run
(
int
);
private
:
float
eps_val_32
,
eps_vec_32
;
double
eps_val_64
,
eps_vec_64
;
void
check_pair_count
(
const
cv
::
Mat
&
src
,
const
cv
::
Mat
&
evalues
);
void
check_pair_count
(
const
cv
::
Mat
&
src
,
const
cv
::
Mat
&
evalues
,
const
cv
::
Mat
&
evectors
);
void
check_pair_count
(
const
cv
::
Mat
&
src
,
const
cv
::
Mat
&
evalues
,
int
low_index
=
-
1
,
int
high_index
=
-
1
);
void
check_pair_count
(
const
cv
::
Mat
&
src
,
const
cv
::
Mat
&
evalues
,
const
cv
::
Mat
&
evectors
,
int
low_index
=
-
1
,
int
high_index
=
-
1
);
bool
check_diff
(
const
cv
::
Mat
&
original_values
,
const
cv
::
Mat
&
original_vectors
,
const
cv
::
Mat
&
found_values
,
const
cv
::
Mat
&
found_vectors
,
const
bool
compute_eigen_vectors
,
const
int
values_type
,
const
int
norm_type
);
...
...
@@ -27,14 +28,20 @@ class Core_EigenTest: public cvtest::BaseTest
Core_EigenTest
::
Core_EigenTest
()
:
eps_val_32
(
1e-6
),
eps_vec_32
(
1e-5
),
eps_val_64
(
1e-12
),
eps_vec_64
(
1e-11
)
{}
Core_EigenTest
::~
Core_EigenTest
()
{}
void
Core_EigenTest
::
check_pair_count
(
const
cv
::
Mat
&
src
,
const
cv
::
Mat
&
evalues
)
void
Core_EigenTest
::
check_pair_count
(
const
cv
::
Mat
&
src
,
const
cv
::
Mat
&
evalues
,
int
low_index
,
int
high_index
)
{
CV_Assert
(
src
.
rows
==
evalues
.
rows
&&
evalues
.
cols
==
1
);
int
n
=
src
.
rows
,
s
=
sign
(
high_index
);
CV_Assert
(
evalues
.
rows
==
n
-
(
low_index
+
1
)
-
((
int
)((
n
/
2.0
)
*
(
s
*
s
-
s
))
+
(
1
+
s
-
s
*
s
)
*
(
n
-
(
high_index
+
1
)))
&&
evalues
.
cols
==
1
);
}
void
Core_EigenTest
::
check_pair_count
(
const
cv
::
Mat
&
src
,
const
cv
::
Mat
&
evalues
,
const
cv
::
Mat
&
evectors
)
void
Core_EigenTest
::
check_pair_count
(
const
cv
::
Mat
&
src
,
const
cv
::
Mat
&
evalues
,
const
cv
::
Mat
&
evectors
,
int
low_index
,
int
high_index
)
{
CV_Assert
(
src
.
rows
==
evectors
.
rows
&&
src
.
cols
==
evectors
.
cols
&&
src
.
rows
==
evalues
.
rows
&&
evalues
.
cols
==
1
);
int
n
=
src
.
rows
,
s
=
sign
(
high_index
);
int
right_eigen_pair_count
=
n
-
(
low_index
+
1
)
-
((
int
)((
n
/
2.0
)
*
(
s
*
s
-
s
))
+
(
1
+
s
-
s
*
s
)
*
(
n
-
(
high_index
+
1
)));
CV_Assert
(
evectors
.
rows
==
right_eigen_pair_count
&&
evectors
.
cols
==
right_eigen_pair_count
&&
evalues
.
rows
==
right_eigen_pair_count
&&
evalues
.
cols
==
1
);
}
bool
Core_EigenTest
::
check_diff
(
const
cv
::
Mat
&
original_values
,
const
cv
::
Mat
&
original_vectors
,
...
...
@@ -50,7 +57,7 @@ bool Core_EigenTest::check_diff(const cv::Mat& original_values, const cv::Mat& o
{
double
diff_val
=
cv
::
norm
(
original_values
,
found_values
,
norm_type
);
double
diff_vec
=
cv
::
norm
(
original_vectors
,
found_vectors
,
norm_type
);
if
(
diff_val
>
eps_val
)
{
ts
->
printf
(
cvtest
::
TS
::
LOG
,
"Accuracy of eigen values computing less than requered."
);
return
false
;
}
if
(
diff_vec
>
eps_vec
)
{
ts
->
printf
(
cvtest
::
TS
::
LOG
,
"Accuracy of eigen vectors computing less than requered."
);
return
false
;
}
...
...
@@ -75,20 +82,18 @@ bool Core_EigenTest::check_diff(const cv::Mat& original_values, const cv::Mat& o
void
Core_EigenTest
::
run
(
int
)
{
const
int
DIM
=
3
;
bool
ok
=
true
;
// tests data
float
sym_matrix
[
DIM
][
DIM
]
=
{
{
0.0
f
,
1.0
f
,
0.0
f
},
{
1.0
f
,
0.0
f
,
1.0
f
},
{
0.0
f
,
1.0
f
,
0.0
f
}
};
// source symmerical matrix
float
_eval
[
DIM
]
=
{
0.5
f
*
sqrt
(
2.0
f
),
0.0
f
,
-
0.5
f
*
sqrt
(
2.0
f
)
};
// eigen values of 3*3 matrix
float
_eval
[
DIM
]
=
{
sqrt
(
2.0
f
),
0.0
f
,
-
sqrt
(
2.0
f
)
};
// eigen values of 3*3 matrix
float
_evec
[
DIM
][
DIM
]
=
{
{
0.5
f
,
-
1.0
f
,
0.5
f
},
{
0.5
f
*
sqrt
(
2.0
f
),
0.0
f
,
-
0.5
f
*
sqrt
(
2.0
f
)
},
{
0.5
f
,
1.0
f
,
0.5
f
}
};
// eigen vectors of source matrix
float
_evec
[
DIM
][
DIM
]
=
{
{
1.0
f
,
sqrt
(
2.0
f
),
1.0
f
},
{
-
1.0
f
,
0.0
f
,
1.0
f
},
{
1.0
f
,
-
sqrt
(
2.0
f
),
1.0
f
}
};
// eigen vectors of source matrix
// initializing Mat-objects
...
...
@@ -100,6 +105,8 @@ void Core_EigenTest::run(int)
cv
::
eigen
(
src_32
,
true
,
eigen_values
,
eigen_vectors
);
check_pair_count
(
src_32
,
eigen_values
,
eigen_vectors
);
if
(
!
check_diff
(
eval_32
,
evec_32
,
eigen_values
,
eigen_vectors
,
true
,
CV_32FC1
,
NORM_L1
))
return
;
if
(
!
check_diff
(
eval_32
,
evec_32
,
eigen_values
,
eigen_vectors
,
true
,
CV_32FC1
,
NORM_L2
))
return
;
if
(
!
check_diff
(
eval_32
,
evec_32
,
eigen_values
,
eigen_vectors
,
true
,
CV_32FC1
,
NORM_INF
))
return
;
...
...
@@ -161,6 +168,45 @@ void Core_EigenTest::run(int)
if
(
!
check_diff
(
eval_64
,
evec_64
,
eigen_values
,
eigen_vectors
,
false
,
CV_64FC1
,
NORM_L1
))
return
;
if
(
!
check_diff
(
eval_64
,
evec_64
,
eigen_values
,
eigen_vectors
,
false
,
CV_64FC1
,
NORM_L2
))
return
;
if
(
!
check_diff
(
eval_64
,
evec_64
,
eigen_values
,
eigen_vectors
,
false
,
CV_64FC1
,
NORM_INF
))
return
;
const
int
low_index
=
2
,
high_index
=
3
;
cv
::
Mat
submat_val_32
(
eval_32
.
rowRange
(
low_index
,
high_index
));
cv
::
Mat
submat_vec_32
(
evec_32
.
rowRange
(
low_index
,
high_index
));
cv
::
eigen
(
src_32
,
eigen_values
,
low_index
,
high_index
);
check_pair_count
(
src_32
,
eigen_values
,
eigen_vectors
,
low_index
,
high_index
);
if
(
!
check_diff
(
submat_val_32
,
submat_vec_32
,
eigen_values
,
eigen_vectors
,
false
,
CV_32FC1
,
NORM_L1
))
return
;
if
(
!
check_diff
(
submat_val_32
,
submat_vec_32
,
eigen_values
,
eigen_vectors
,
false
,
CV_32FC1
,
NORM_L2
))
return
;
if
(
!
check_diff
(
submat_val_32
,
submat_vec_32
,
eigen_values
,
eigen_vectors
,
false
,
CV_32FC1
,
NORM_INF
))
return
;
cv
::
eigen
(
src_32
,
eigen_values
,
eigen_vectors
,
low_index
,
high_index
);
check_pair_count
(
src_32
,
eigen_values
,
eigen_vectors
,
low_index
,
high_index
);
if
(
!
check_diff
(
submat_val_32
,
submat_vec_32
,
eigen_values
,
eigen_vectors
,
true
,
CV_32FC1
,
NORM_L1
))
return
;
if
(
!
check_diff
(
submat_val_32
,
submat_vec_32
,
eigen_values
,
eigen_vectors
,
true
,
CV_32FC1
,
NORM_L2
))
return
;
if
(
!
check_diff
(
submat_val_32
,
submat_vec_32
,
eigen_values
,
eigen_vectors
,
true
,
CV_32FC1
,
NORM_INF
))
return
;
cv
::
Mat
submat_val_64
(
eval_64
.
rowRange
(
low_index
,
high_index
));
cv
::
Mat
submat_vec_64
(
evec_64
.
rowRange
(
low_index
,
high_index
));
cv
::
eigen
(
src_64
,
eigen_values
,
low_index
,
high_index
);
check_pair_count
(
src_64
,
eigen_values
,
low_index
,
high_index
);
if
(
!
check_diff
(
submat_val_64
,
submat_vec_64
,
eigen_values
,
eigen_vectors
,
false
,
CV_64FC1
,
NORM_L1
))
return
;
if
(
!
check_diff
(
submat_val_64
,
submat_vec_64
,
eigen_values
,
eigen_vectors
,
false
,
CV_64FC1
,
NORM_L2
))
return
;
if
(
!
check_diff
(
submat_val_64
,
submat_vec_64
,
eigen_values
,
eigen_vectors
,
false
,
CV_64FC1
,
NORM_INF
))
return
;
cv
::
eigen
(
src_64
,
eigen_values
,
eigen_vectors
,
low_index
,
high_index
);
check_pair_count
(
src_64
,
eigen_values
,
low_index
,
high_index
);
if
(
!
check_diff
(
submat_val_64
,
submat_vec_64
,
eigen_values
,
eigen_vectors
,
true
,
CV_64FC1
,
NORM_L1
))
return
;
if
(
!
check_diff
(
submat_val_64
,
submat_vec_64
,
eigen_values
,
eigen_vectors
,
true
,
CV_64FC1
,
NORM_L2
))
return
;
if
(
!
check_diff
(
submat_val_64
,
submat_vec_64
,
eigen_values
,
eigen_vectors
,
true
,
CV_64FC1
,
NORM_INF
))
return
;
}
TEST
(
Core_Eigen
,
quality
)
{
Core_EigenTest
test
;
test
.
safe_run
();
}
...
...
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