first version of Eigen test for C++ interface
authorAlexander Reshetnikov <no@email>
Tue, 20 Dec 2011 18:59:55 +0000 (18:59 +0000)
committerAlexander Reshetnikov <no@email>
Tue, 20 Dec 2011 18:59:55 +0000 (18:59 +0000)
modules/core/test/test_eigen.cpp [new file with mode: 0644]

diff --git a/modules/core/test/test_eigen.cpp b/modules/core/test/test_eigen.cpp
new file mode 100644 (file)
index 0000000..65979ed
--- /dev/null
@@ -0,0 +1,167 @@
+#include "test_precomp.hpp"\r
+\r
+using namespace cv;\r
+using namespace std;\r
+\r
+class Core_EigenTest: public cvtest::BaseTest\r
+{\r
+ public: \r
+       Core_EigenTest();\r
+       ~Core_EigenTest();\r
+\r
+ protected:\r
+        void run (int);\r
+\r
+       \r
+ private:\r
\r
+ float eps_val_32, eps_vec_32;\r
+ double eps_val_64, eps_vec_64;\r
+ void check_pair_count(const cv::Mat& src, const cv::Mat& evalues);\r
+ void check_pair_count(const cv::Mat& src, const cv::Mat& evalues, const cv::Mat& evectors);\r
+ bool check_diff(const cv::Mat& original_values, const cv::Mat& original_vectors, \r
+                                const cv::Mat& found_values, const cv::Mat& found_vectors, \r
+                                const bool compute_eigen_vectors, const int values_type, const int norm_type);\r
+};\r
+\r
+Core_EigenTest::Core_EigenTest() : eps_val_32(1e-6), eps_vec_32(1e-5), eps_val_64(1e-12), eps_vec_64(1e-11) {}\r
+Core_EigenTest::~Core_EigenTest() {}\r
+\r
+void Core_EigenTest::check_pair_count(const cv::Mat& src, const cv::Mat& evalues)\r
+{\r
+ CV_Assert(src.rows == evalues.rows && evalues.cols == 1);\r
+}\r
+\r
+void Core_EigenTest::check_pair_count(const cv::Mat& src, const cv::Mat& evalues, const cv::Mat& evectors)\r
+{\r
+ CV_Assert( src.rows == evectors.rows && src.cols == evectors.cols && src.rows == evalues.rows && evalues.cols == 1);\r
+}\r
+\r
+bool Core_EigenTest::check_diff(const cv::Mat& original_values, const cv::Mat& original_vectors, \r
+                                                               const cv::Mat& found_values, const cv::Mat& found_vectors, \r
+                                                               const bool compute_eigen_vectors, const int values_type, const int norm_type)\r
+{\r
+ double eps_val = values_type == CV_32FC1 ? eps_val_32 : eps_val_64;\r
+ double eps_vec = values_type == CV_32FC1 ? eps_vec_32 : eps_vec_64;\r
+\r
+ switch (compute_eigen_vectors)\r
+ {\r
+  case true: \r
+               {\r
+                        double diff_val = cv::norm(original_values, found_values, norm_type);\r
+                        double diff_vec = cv::norm(original_vectors, found_vectors, norm_type);\r
+                        \r
+                        if (diff_val > eps_val) { ts->printf(cvtest::TS::LOG, "Accuracy of eigen values computing less than requered."); return false; }\r
+                        if (diff_vec > eps_vec) { ts->printf(cvtest::TS::LOG, "Accuracy of eigen vectors computing less than requered."); return false; }\r
+                       \r
+                        break;\r
+               }\r
+\r
+  case false: \r
+                {\r
+                         double diff_val = cv::norm(original_values, found_values, norm_type);\r
+                                        \r
+                         if (diff_val > eps_val) { ts->printf(cvtest::TS::LOG, "Accuracy of eigen values computing less than requered."); return false; }\r
+               \r
+                         break;\r
+                }\r
+\r
+  default:;\r
+ }\r
+\r
+ return true;\r
+}\r
+\r
+void Core_EigenTest::run(int)\r
+{\r
+  const int DIM = 3;\r
+   \r
+  bool ok = true;                                                              \r
+\r
+  // tests data \r
+\r
+  float sym_matrix[DIM][DIM] = { { 0.0f, 1.0f, 0.0f }, \r
+                                                                { 1.0f, 0.0f, 1.0f }, \r
+                                                        { 0.0f, 1.0f, 0.0f } };                                        // source symmerical matrix\r
+\r
+  float _eval[DIM] = { 0.5f*sqrt(2.0f), 0.0f, -0.5f*sqrt(2.0f) };                  // eigen values of 3*3 matrix\r
+\r
+  float _evec[DIM][DIM] = { { 0.5f, -1.0f, 0.5f }, \r
+                                                       { 0.5f*sqrt(2.0f), 0.0f, -0.5f*sqrt(2.0f) },\r
+                                                       { 0.5f, 1.0f, 0.5f } };                                                 // eigen vectors of source matrix\r
+\r
+  // initializing Mat-objects\r
+  \r
+  cv::Mat eigen_values, eigen_vectors;\r
+  \r
+  cv::Mat src_32(DIM, DIM, CV_32FC1, (void*)&sym_matrix[0]);\r
+  cv::Mat eval_32(DIM, 1, CV_32FC1, (void*)&_eval);\r
+  cv::Mat evec_32(DIM, DIM, CV_32FC1, (void*)&_evec[0]);\r
+\r
+  cv::eigen(src_32, true, eigen_values, eigen_vectors);\r
+\r
+  if (!check_diff(eval_32, evec_32, eigen_values, eigen_vectors, true, CV_32FC1, NORM_L1)) return;  \r
+  if (!check_diff(eval_32, evec_32, eigen_values, eigen_vectors, true, CV_32FC1, NORM_L2)) return;\r
+  if (!check_diff(eval_32, evec_32, eigen_values, eigen_vectors, true, CV_32FC1, NORM_INF)) return;\r
+\r
+  cv::eigen(src_32, false, eigen_values, eigen_vectors);\r
+\r
+  check_pair_count(src_32, eigen_values);\r
+\r
+  if (!check_diff(eval_32, evec_32, eigen_values, eigen_vectors, false, CV_32FC1, NORM_L1)) return;  \r
+  if (!check_diff(eval_32, evec_32, eigen_values, eigen_vectors, false, CV_32FC1, NORM_L2)) return;\r
+  if (!check_diff(eval_32, evec_32, eigen_values, eigen_vectors, false, CV_32FC1, NORM_INF)) return;\r
+  \r
+  cv::eigen(src_32, eigen_values, eigen_vectors);\r
+\r
+  check_pair_count(src_32, eigen_values, eigen_vectors);\r
+\r
+  if (!check_diff(eval_32, evec_32, eigen_values, eigen_vectors, true, CV_32FC1, NORM_L1)) return;  \r
+  if (!check_diff(eval_32, evec_32, eigen_values, eigen_vectors, true, CV_32FC1, NORM_L2)) return;\r
+  if (!check_diff(eval_32, evec_32, eigen_values, eigen_vectors, true, CV_32FC1, NORM_INF)) return;\r
+\r
+  cv::eigen(src_32, eigen_values);\r
+  \r
+  check_pair_count(src_32, eigen_values);\r
+\r
+  if (!check_diff(eval_32, evec_32, eigen_values, eigen_vectors, false, CV_32FC1, NORM_L1)) return;  \r
+  if (!check_diff(eval_32, evec_32, eigen_values, eigen_vectors, false, CV_32FC1, NORM_L2)) return;\r
+  if (!check_diff(eval_32, evec_32, eigen_values, eigen_vectors, false, CV_32FC1, NORM_INF)) return;\r
+   \r
+  cv::Mat src_64(DIM, DIM, CV_64FC1, (void*)&sym_matrix[0]);\r
+  cv::Mat eval_64(DIM, 1, CV_64FC1, (void*)&_eval);\r
+  cv::Mat evec_64(DIM, DIM, CV_64FC1, (void*)&_evec[0]);\r
+\r
+  cv::eigen(src_64, true, eigen_values, eigen_vectors);\r
+\r
+  if (!check_diff(eval_64, evec_64, eigen_values, eigen_vectors, true, CV_64FC1, NORM_L1)) return;  \r
+  if (!check_diff(eval_64, evec_64, eigen_values, eigen_vectors, true, CV_64FC1, NORM_L2)) return;\r
+  if (!check_diff(eval_64, evec_64, eigen_values, eigen_vectors, true, CV_64FC1, NORM_INF)) return;\r
+\r
+  cv::eigen(src_64, false, eigen_values, eigen_vectors);\r
+\r
+  check_pair_count(src_64, eigen_values);\r
+\r
+  if (!check_diff(eval_64, evec_64, eigen_values, eigen_vectors, false, CV_64FC1, NORM_L1)) return;  \r
+  if (!check_diff(eval_64, evec_64, eigen_values, eigen_vectors, false, CV_64FC1, NORM_L2)) return;\r
+  if (!check_diff(eval_64, evec_64, eigen_values, eigen_vectors, false, CV_64FC1, NORM_INF)) return;\r
+  \r
+  cv::eigen(src_64, eigen_values, eigen_vectors);\r
+\r
+  check_pair_count(src_64, eigen_values, eigen_vectors);\r
+\r
+  if (!check_diff(eval_64, evec_64, eigen_values, eigen_vectors, true, CV_64FC1, NORM_L1)) return;  \r
+  if (!check_diff(eval_64, evec_64, eigen_values, eigen_vectors, true, CV_64FC1, NORM_L2)) return;\r
+  if (!check_diff(eval_64, evec_64, eigen_values, eigen_vectors, true, CV_64FC1, NORM_INF)) return;\r
+\r
+  cv::eigen(src_64, eigen_values);\r
+  \r
+  check_pair_count(src_64, eigen_values);\r
+\r
+  if (!check_diff(eval_64, evec_64, eigen_values, eigen_vectors, false, CV_64FC1, NORM_L1)) return;  \r
+  if (!check_diff(eval_64, evec_64, eigen_values, eigen_vectors, false, CV_64FC1, NORM_L2)) return;\r
+  if (!check_diff(eval_64, evec_64, eigen_values, eigen_vectors, false, CV_64FC1, NORM_INF)) return;\r
+}\r
+\r
+TEST(Core_Eigen, quality) { Core_EigenTest test; test.safe_run(); }\r
+\r