// This file is part of OpenCV project. // It is subject to the license terms in the LICENSE file found in the top-level directory // of this distribution and at http://opencv.org/license.html. #include "test_precomp.hpp" namespace opencv_test { namespace { static void loadKeypoints(const std::string& vP_path, const std::string& oP_path, const std::string& sP_path, const std::string& w_path, std::vector& keypoints, std::vector& nn) { { std::ifstream file(vP_path.c_str()); if (file.is_open()) { float x = 0, y = 0; while (file >> x >> y) { keypoints.push_back(cv::KeyPoint(x, y, 0)); } } } { std::ifstream file(oP_path.c_str()); if (file.is_open()) { float orientation = 0; size_t idx = 0; while (file >> orientation) { keypoints[idx].angle = static_cast(orientation * 180.0 / CV_PI); idx++; } } } { std::ifstream file(sP_path.c_str()); if (file.is_open()) { float scale = 0; size_t idx = 0; while (file >> scale) { keypoints[idx].size = scale; idx++; } } } { std::ifstream file(w_path.c_str()); if (file.is_open()) { int neighborIdx = 0; while (file >> neighborIdx) { nn.push_back(neighborIdx); } } } ASSERT_TRUE(!keypoints.empty()); } static void loadGroundTruth(const std::string& d1_path, const std::string& b1_path, std::vector& groundTruth) { std::vector d1_vec; { std::ifstream file(d1_path.c_str()); if (file.is_open()) { int idx = 0; while (file >> idx) { d1_vec.push_back(idx-1); } } } std::vector b1_vec; { std::ifstream file(b1_path.c_str()); if (file.is_open()) { int idx = 0; while (file >> idx) { b1_vec.push_back(idx-1); } } } ASSERT_TRUE(!d1_vec.empty()); ASSERT_EQ(d1_vec.size(), b1_vec.size()); for (size_t i = 0; i < d1_vec.size(); i++) { groundTruth.push_back(cv::DMatch(d1_vec[i], b1_vec[i], 0)); } } TEST(XFeatures2d_LogosMatcher, logos_matcher_regression) { const std::string vP1_path = cvtest::findDataFile("detectors_descriptors_evaluation/matching/LOGOS/vP1.txt"); const std::string oP1_path = cvtest::findDataFile("detectors_descriptors_evaluation/matching/LOGOS/oP1.txt"); const std::string sP1_path = cvtest::findDataFile("detectors_descriptors_evaluation/matching/LOGOS/sP1.txt"); const std::string w1_path = cvtest::findDataFile("detectors_descriptors_evaluation/matching/LOGOS/w1.txt"); const std::string vP2_path = cvtest::findDataFile("detectors_descriptors_evaluation/matching/LOGOS/vP2.txt"); const std::string oP2_path = cvtest::findDataFile("detectors_descriptors_evaluation/matching/LOGOS/oP2.txt"); const std::string sP2_path = cvtest::findDataFile("detectors_descriptors_evaluation/matching/LOGOS/sP2.txt"); const std::string w2_path = cvtest::findDataFile("detectors_descriptors_evaluation/matching/LOGOS/w2.txt"); std::vector keypoints1, keypoints2; std::vector nn1, nn2; loadKeypoints(vP1_path, oP1_path, sP1_path, w1_path, keypoints1, nn1); loadKeypoints(vP2_path, oP2_path, sP2_path, w2_path, keypoints2, nn2); std::vector matchesLogos; matchLOGOS(keypoints1, keypoints2, nn1, nn2, matchesLogos); std::vector groundTruth; const std::string d1_path = cvtest::findDataFile("detectors_descriptors_evaluation/matching/LOGOS/d1.txt"); const std::string b1_path = cvtest::findDataFile("detectors_descriptors_evaluation/matching/LOGOS/b1.txt"); loadGroundTruth(d1_path, b1_path, groundTruth); int correctMatches = 0; for (size_t i = 0; i < matchesLogos.size(); i++) { for (size_t j = 0; j < groundTruth.size(); j++) { if (groundTruth[j].queryIdx == matchesLogos[i].queryIdx && groundTruth[j].trainIdx == matchesLogos[j].trainIdx) { correctMatches++; break; } } } ASSERT_EQ(static_cast(groundTruth.size()), correctMatches) << "groundTruth: " << groundTruth.size() << " ; matchesLogos: " << matchesLogos.size() << " ; correctMatches: " << correctMatches; } }} // namespace