Skip to content

Task02 Евгений Новокшанов ИТМО ПОВС#41

Open
NovokshanovE wants to merge 1 commit intoPhotogrammetryCourse:task02from
NovokshanovE:task02
Open

Task02 Евгений Новокшанов ИТМО ПОВС#41
NovokshanovE wants to merge 1 commit intoPhotogrammetryCourse:task02from
NovokshanovE:task02

Conversation

@NovokshanovE
Copy link

@NovokshanovE NovokshanovE commented Mar 18, 2026

1) Зачем фильтровать матчи, если потом все равно RANSAC?

Потому что RANSAC работает тем хуже, чем больше мусора.
Если выбросов много, он дольше ищет нормальный набор и может дать менее стабильный результат.
Поэтому лучше заранее почистить матчи.

2) Почему одного Cluster filtering мало? И почему одного Ratio test тоже мало?

Cluster filtering смотрит больше на геометрию, но на повторяющихся текстурах может пропускать плохие матчи.
Ratio test режет неоднозначные дескрипторы, но геометрически кривые матчи может оставить.
Нормально работает именно связка двух фильтров.

3) Какая проблема с фиксацией H33 = 1?

Гомография задается с точностью до масштаба, и реальный H33 может быть почти 0.
Если жестко прибить его к 1, решение может стать плохо обусловленным.
Надежнее решать полную систему и потом аккуратно нормировать (например через SVD-подход).

4) Подвох при склейке больших панорам/ортофото этим методом?

Копится ошибка по цепочке гомографий.
Чем дальше кадр от корня, тем больше дрейф.
Плюс результат заметно зависит от выбора корневой картинки.

5) Как автоматически построить граф склейки?

Сделать попарный matching всех картинок, оценить качество пары по числу/доле inliers, построить взвешенный graph.
Дальше взять надежные связи (например через MST) и от выбранного корня считать преобразования.

6) Если SIFT не проходил тесты, где была проблема?

У меня падал MATCHING.SimpleStitching при ENABLE_MY_DESCRIPTOR=1.
Проблема оказалась не в самом SIFT, а в слишком мягком ratio-пороге при фильтрации матчей.
После ужесточения порога (0.75 -> 0.7) тест прошел.

7) Фидбек по заданию

Сложнее всего было поймать причину падения, когда почти все остальное уже проходило.
Было бы удобно добавить в README короткий чеклист отладки по шагам.

Github Actions CI

Run ./build/test_matching
Running main() from /Users/runner/work/PhotogrammetryTasks2026/PhotogrammetryTasks2026/libs/3rdparty/libgtest/googletest/src/gtest_main.cc
[==========] Running 20 tests from 2 test suites.
[----------] Global test environment set-up.
[----------] 18 tests from MATCHING
[ RUN      ] MATCHING.SimpleStitching
testing sift detector/descriptor...
estimateHomographyRANSAC : support: 1004/1004
estimateHomographyRANSAC : best support: 1004/1004
keypoints RMSE: 0.106751, color RMSE: 5.6938
testing my detector/descriptor...
estimateHomographyRANSAC : support: 345/839
estimateHomographyRANSAC : support: 839/839
estimateHomographyRANSAC : best support: 839/839
keypoints RMSE: 0.0863991, color RMSE: 5.6938
[       OK ] MATCHING.SimpleStitching (1027 ms)
[ RUN      ] MATCHING.SimpleMatching
testing sift detector/descriptor...
flann matching...
cv flann matching...
brute force matching
BruteforceMatcher::knnMatch : n query desc : 3919, n train desc : 3522
filtering matches by ratio test...
filtering matches by clusters...
filtering matches by ratio & clusters
estimating homography...
estimateHomographyRANSAC : support: 938/1005
estimateHomographyRANSAC : support: 987/1005
estimateHomographyRANSAC : support: 1005/1005
estimateHomographyRANSAC : best support: 1005/1005
evaluating homography...
nn_score: 0.627456, nn2_score: 0.275836, nn_score_cv: 0.612911, nn2_score_cv: 0.278132, time_my: 0.05837, time_cv: 0.051602, time_bruteforce: 6.50205, good_nn: 0.261036, good_ratio: 0.992165, good_clusters: 0.992908, good_ratio_and_clusters: 0.999005
testing my detector/descriptor...
flann matching...
cv flann matching...
brute force matching
BruteforceMatcher::knnMatch : n query desc : 3480, n train desc : 3119
filtering matches by ratio test...
filtering matches by clusters...
filtering matches by ratio & clusters
estimating homography...
estimateHomographyRANSAC : support: 345/839
estimateHomographyRANSAC : support: 594/839
estimateHomographyRANSAC : support: 824/839
estimateHomographyRANSAC : support: 839/839
estimateHomographyRANSAC : best support: 839/839
evaluating homography...
nn_score: 0.621839, nn2_score: 0.271264, nn_score_cv: 0.617241, nn2_score_cv: 0.280172, time_my: 0.038509, time_cv: 0.052952, time_bruteforce: 4.92368, good_nn: 0.246552, good_ratio: 0.988345, good_clusters: 0.993964, good_ratio_and_clusters: 1
[       OK ] MATCHING.SimpleMatching (12730 ms)
[ RUN      ] MATCHING.Rotate10
testing sift detector/descriptor...
flann matching...
cv flann matching...
filtering matches by ratio test...
filtering matches by clusters...
filtering matches by ratio & clusters
estimating homography...
estimateHomographyRANSAC : support: 227/753
estimateHomographyRANSAC : support: 345/753
estimateHomographyRANSAC : support: 471/753
estimateHomographyRANSAC : support: 750/753
estimateHomographyRANSAC : support: 752/753
estimateHomographyRANSAC : support: 753/753
estimateHomographyRANSAC : best support: 753/753
evaluating homography...
nn_score: 0, nn2_score: 0, nn_score_cv: 0, nn2_score_cv: 0, time_my: 0.049212, time_cv: 0.060892, time_bruteforce: 0, good_nn: 0.19903, good_ratio: 0.988266, good_clusters: 0.994911, good_ratio_and_clusters: 0.994688
testing my detector/descriptor...
flann matching...
cv flann matching...
filtering matches by ratio test...
filtering matches by clusters...
filtering matches by ratio & clusters
estimating homography...
estimateHomographyRANSAC : support: 350/680
estimateHomographyRANSAC : support: 567/680
gauss: infinitely many solutions found
gauss: xs0: 705.649, 590.38, 590.38, 688.098, 
estimateHomographyRANSAC : support: 678/680
gauss: ys0: 423.375, 553.942, 553.942, 255.118, 
estimateHomographyRANSAC : support: 680/680
estimateHomographyRANSAC : best support: 680/680
evaluating homography...
nn_score: 0, nn2_score: 0, nn_score_cv: 0, nn2_score_cv: 0, time_my: 0.088625, time_cv: 0.067231, time_bruteforce: 0, good_nn: 0.206034, good_ratio: 0.988489, good_clusters: 0.99187, good_ratio_and_clusters: 0.997059
[       OK ] MATCHING.Rotate10 (1875 ms)
[ RUN      ] MATCHING.Rotate20
testing sift detector/descriptor...
flann matching...
cv flann matching...
filtering matches by ratio test...
filtering matches by clusters...
filtering matches by ratio & clusters
estimating homography...
estimateHomographyRANSAC : support: 755/755
estimateHomographyRANSAC : best support: 755/755
evaluating homography...
nn_score: 0, nn2_score: 0, nn_score_cv: 0, nn2_score_cv: 0, time_my: 0.056132, time_cv: 0.059706, time_bruteforce: 0, good_nn: 0.201582, good_ratio: 0.983312, good_clusters: 0.971795, good_ratio_and_clusters: 0.997351
testing my detector/descriptor...
flann matching...
cv flann matching...
filtering matches by ratio test...
filtering matches by clusters...
filtering matches by ratio & clusters
estimating homography...
estimateHomographyRANSAC : support: 669/681
estimateHomographyRANSAC : support: 681/681
estimateHomographyRANSAC : best support: 681/681
evaluating homography...
nn_score: 0, nn2_score: 0, nn_score_cv: 0, nn2_score_cv: 0, time_my: 0.049202, time_cv: 0.048097, time_bruteforce: 0, good_nn: 0.206609, good_ratio: 0.984263, good_clusters: 0.987342, good_ratio_and_clusters: 0.995595
[       OK ] MATCHING.Rotate20 (1443 ms)
[ RUN      ] MATCHING.Rotate30
testing sift detector/descriptor...
flann matching...
cv flann matching...
filtering matches by ratio test...
filtering matches by clusters...
filtering matches by ratio & clusters
estimating homography...
estimateHomographyRANSAC : support: 174/742
estimateHomographyRANSAC : support: 523/742
estimateHomographyRANSAC : support: 691/742
estimateHomographyRANSAC : support: 730/742
estimateHomographyRANSAC : support: 741/742
gauss: infinitely many solutions found
gauss: xs0: 794.107, 605.28, 699.449, 794.107, 
gauss: ys0: 381.534, 494.99, 438.171, 381.534, 
estimateHomographyRANSAC : best support: 741/742
evaluating homography...
nn_score: 0, nn2_score: 0, nn_score_cv: 0, nn2_score_cv: 0, time_my: 0.073047, time_cv: 0.069397, time_bruteforce: 0, good_nn: 0.19801, good_ratio: 0.98946, good_clusters: 0.986631, good_ratio_and_clusters: 0.997305
testing my detector/descriptor...
flann matching...
cv flann matching...
filtering matches by ratio test...
filtering matches by clusters...
filtering matches by ratio & clusters
estimating homography...
estimateHomographyRANSAC : support: 659/659
estimateHomographyRANSAC : best support: 659/659
evaluating homography...
nn_score: 0, nn2_score: 0, nn_score_cv: 0, nn2_score_cv: 0, time_my: 0.048348, time_cv: 0.050543, time_bruteforce: 0, good_nn: 0.204598, good_ratio: 0.988201, good_clusters: 0.988732, good_ratio_and_clusters: 1
[       OK ] MATCHING.Rotate30 (1401 ms)
[ RUN      ] MATCHING.Rotate40
testing sift detector/descriptor...
flann matching...
cv flann matching...
filtering matches by ratio test...
filtering matches by clusters...
filtering matches by ratio & clusters
estimating homography...
estimateHomographyRANSAC : support: 652/753
estimateHomographyRANSAC : support: 752/753
estimateHomographyRANSAC : support: 753/753
estimateHomographyRANSAC : best support: 753/753
evaluating homography...
nn_score: 0, nn2_score: 0, nn_score_cv: 0, nn2_score_cv: 0, time_my: 0.056382, time_cv: 0.066876, time_bruteforce: 0, good_nn: 0.199796, good_ratio: 0.992167, good_clusters: 0.972292, good_ratio_and_clusters: 0.998672
testing my detector/descriptor...
flann matching...
cv flann matching...
filtering matches by ratio test...
filtering matches by clusters...
filtering matches by ratio & clusters
estimating homography...
estimateHomographyRANSAC : support: 509/668
estimateHomographyRANSAC : support: 623/668
estimateHomographyRANSAC : support: 666/668
estimateHomographyRANSAC : support: 668/668
estimateHomographyRANSAC : best support: 668/668
evaluating homography...
nn_score: 0, nn2_score: 0, nn_score_cv: 0, nn2_score_cv: 0, time_my: 0.065667, time_cv: 0.062963, time_bruteforce: 0, good_nn: 0.20546, good_ratio: 0.988304, good_clusters: 0.983607, good_ratio_and_clusters: 1
[       OK ] MATCHING.Rotate40 (1562 ms)
[ RUN      ] MATCHING.Rotate45
testing sift detector/descriptor...
flann matching...
cv flann matching...
filtering matches by ratio test...
filtering matches by clusters...
filtering matches by ratio & clusters
estimating homography...
estimateHomographyRANSAC : support: 743/744
estimateHomographyRANSAC : support: 744/744
estimateHomographyRANSAC : best support: 744/744
evaluating homography...
nn_score: 0, nn2_score: 0, nn_score_cv: 0, nn2_score_cv: 0, time_my: 0.056042, time_cv: 0.064671, time_bruteforce: 0, good_nn: 0.19852, good_ratio: 0.989446, good_clusters: 0.997151, good_ratio_and_clusters: 0.995968
testing my detector/descriptor...
flann matching...
cv flann matching...
filtering matches by ratio test...
filtering matches by clusters...
filtering matches by ratio & clusters
estimating homography...
estimateHomographyRANSAC : support: 623/665
estimateHomographyRANSAC : support: 656/665
estimateHomographyRANSAC : support: 661/665
estimateHomographyRANSAC : support: 665/665
estimateHomographyRANSAC : best support: 665/665
evaluating homography...
nn_score: 0, nn2_score: 0, nn_score_cv: 0, nn2_score_cv: 0, time_my: 0.061548, time_cv: 0.056099, time_bruteforce: 0, good_nn: 0.204023, good_ratio: 0.995588, good_clusters: 0.988796, good_ratio_and_clusters: 1
[       OK ] MATCHING.Rotate45 (1516 ms)
[ RUN      ] MATCHING.Rotate90
testing sift detector/descriptor...
flann matching...
cv flann matching...
filtering matches by ratio test...
filtering matches by clusters...
filtering matches by ratio & clusters
estimating homography...
estimateHomographyRANSAC : support: 825/826
gauss: infinitely many solutions found
gauss: xs0: 667.008, 569.489, 762.18, 667.008, 
gauss: ys0: 588.365, 392.276, 388.312, 588.365, 
estimateHomographyRANSAC : best support: 825/826
evaluating homography...
nn_score: 0, nn2_score: 0, nn_score_cv: 0, nn2_score_cv: 0, time_my: 0.054797, time_cv: 0.055571, time_bruteforce: 0, good_nn: 0.216127, good_ratio: 0.989349, good_clusters: 0.983834, good_ratio_and_clusters: 0.996368
testing my detector/descriptor...
flann matching...
cv flann matching...
filtering matches by ratio test...
filtering matches by clusters...
filtering matches by ratio & clusters
estimating homography...
estimateHomographyRANSAC : support: 371/742
estimateHomographyRANSAC : support: 682/742
estimateHomographyRANSAC : support: 741/742
estimateHomographyRANSAC : support: 742/742
estimateHomographyRANSAC : best support: 742/742
evaluating homography...
nn_score: 0, nn2_score: 0, nn_score_cv: 0, nn2_score_cv: 0, time_my: 0.054766, time_cv: 0.041612, time_bruteforce: 0, good_nn: 0.223563, good_ratio: 0.990814, good_clusters: 0.986395, good_ratio_and_clusters: 1
[       OK ] MATCHING.Rotate90 (1350 ms)
[ RUN      ] MATCHING.Scale50
testing sift detector/descriptor...
flann matching...
cv flann matching...
filtering matches by ratio test...
filtering matches by clusters...
filtering matches by ratio & clusters
estimating homography...
transformPoint : invalid homogeneous coordinate
estimateHomographyRANSAC : support: 9/164
estimateHomographyRANSAC : support: 132/164
estimateHomographyRANSAC : support: 134/164
estimateHomographyRANSAC : support: 160/164
transformPoint : invalid homogeneous coordinate
gauss: infinitely many solutions found
gauss: xs0: 452.546, 655.505, 452.546, 707.096, 
gauss: ys0: 162.457, 248.201, 162.457, 396.287, 
gauss: infinitely many solutions found
gauss: xs0: 706.788, 573.595, 706.788, 539.267, 
gauss: ys0: 232.891, 398.231, 232.891, 579.001, 
transformPoint : invalid homogeneous coordinate
transformPoint : invalid homogeneous coordinate
gauss: infinitely many solutions found
gauss: xs0: 451.823, 451.823, 744.281, 706.788, 
gauss: ys0: 162.842, 162.842, 221.426, 232.891, 
gauss: infinitely many solutions found
gauss: xs0: 664.029, 641.098, 705.313, 641.098, 
gauss: ys0: 620.78, 600.161, 246.463, 600.161, 
estimateHomographyRANSAC : best support: 160/164
evaluating homography...
too few matches: 0
nn_score: 0, nn2_score: 0, nn_score_cv: 0, nn2_score_cv: 0, time_my: 0.028507, time_cv: 0.028796, time_bruteforce: 0, good_nn: 0.0446542, good_ratio: 0.909605, good_clusters: 0, good_ratio_and_clusters: 0.969512
testing my detector/descriptor...
flann matching...
cv flann matching...
filtering matches by ratio test...
filtering matches by clusters...
filtering matches by ratio & clusters
estimating homography...
estimateHomographyRANSAC : support: 102/130
estimateHomographyRANSAC : support: 129/130
estimateHomographyRANSAC : support: 130/130
estimateHomographyRANSAC : best support: 130/130
evaluating homography...
too few matches: 0
nn_score: 0, nn2_score: 0, nn_score_cv: 0, nn2_score_cv: 0, time_my: 0.024053, time_cv: 0.024212, time_bruteforce: 0, good_nn: 0.0408046, good_ratio: 0.948529, good_clusters: 0, good_ratio_and_clusters: 0.992308
[       OK ] MATCHING.Scale50 (730 ms)
[ RUN      ] MATCHING.Scale70
testing sift detector/descriptor...
flann matching...
cv flann matching...
filtering matches by ratio test...
filtering matches by clusters...
filtering matches by ratio & clusters
estimating homography...
estimateHomographyRANSAC : support: 208/371
estimateHomographyRANSAC : support: 233/371
estimateHomographyRANSAC : support: 371/371
estimateHomographyRANSAC : best support: 371/371
evaluating homography...
too few matches: 39
nn_score: 0, nn2_score: 0, nn_score_cv: 0, nn2_score_cv: 0, time_my: 0.044368, time_cv: 0.035549, time_bruteforce: 0, good_nn: 0.100791, good_ratio: 0.981627, good_clusters: 0, good_ratio_and_clusters: 1
testing my detector/descriptor...
flann matching...
cv flann matching...
filtering matches by ratio test...
filtering matches by clusters...
filtering matches by ratio & clusters
estimating homography...
estimateHomographyRANSAC : support: 328/328
estimateHomographyRANSAC : best support: 328/328
evaluating homography...
nn_score: 0, nn2_score: 0, nn_score_cv: 0, nn2_score_cv: 0, time_my: 0.033026, time_cv: 0.0311, time_bruteforce: 0, good_nn: 0.101437, good_ratio: 0.965116, good_clusters: 0.931034, good_ratio_and_clusters: 1
[       OK ] MATCHING.Scale70 (1016 ms)
[ RUN      ] MATCHING.Scale90
testing sift detector/descriptor...
flann matching...
cv flann matching...
filtering matches by ratio test...
filtering matches by clusters...
filtering matches by ratio & clusters
estimating homography...
estimateHomographyRANSAC : support: 641/647
estimateHomographyRANSAC : support: 644/647
estimateHomographyRANSAC : support: 645/647
estimateHomographyRANSAC : support: 647/647
estimateHomographyRANSAC : best support: 647/647
evaluating homography...
nn_score: 0, nn2_score: 0, nn_score_cv: 0, nn2_score_cv: 0, time_my: 0.056247, time_cv: 0.046791, time_bruteforce: 0, good_nn: 0.174279, good_ratio: 0.987897, good_clusters: 0.991597, good_ratio_and_clusters: 0.995363
testing my detector/descriptor...
flann matching...
cv flann matching...
filtering matches by ratio test...
filtering matches by clusters...
filtering matches by ratio & clusters
estimating homography...
estimateHomographyRANSAC : support: 598/598
estimateHomographyRANSAC : best support: 598/598
evaluating homography...
nn_score: 0, nn2_score: 0, nn_score_cv: 0, nn2_score_cv: 0, time_my: 0.046041, time_cv: 0.043904, time_bruteforce: 0, good_nn: 0.178448, good_ratio: 0.990148, good_clusters: 0.98008, good_ratio_and_clusters: 0.998328
[       OK ] MATCHING.Scale90 (1242 ms)
[ RUN      ] MATCHING.Scale110
testing sift detector/descriptor...
flann matching...
cv flann matching...
filtering matches by ratio test...
filtering matches by clusters...
filtering matches by ratio & clusters
estimating homography...
estimateHomographyRANSAC : support: 722/784
estimateHomographyRANSAC : support: 782/784
estimateHomographyRANSAC : support: 784/784
estimateHomographyRANSAC : best support: 784/784
evaluating homography...
nn_score: 0, nn2_score: 0, nn_score_cv: 0, nn2_score_cv: 0, time_my: 0.068541, time_cv: 0.054473, time_bruteforce: 0, good_nn: 0.208472, good_ratio: 0.99, good_clusters: 0.988636, good_ratio_and_clusters: 0.997449
testing my detector/descriptor...
flann matching...
cv flann matching...
filtering matches by ratio test...
filtering matches by clusters...
filtering matches by ratio & clusters
estimating homography...
estimateHomographyRANSAC : support: 342/700
estimateHomographyRANSAC : support: 700/700
estimateHomographyRANSAC : best support: 700/700
evaluating homography...
nn_score: 0, nn2_score: 0, nn_score_cv: 0, nn2_score_cv: 0, time_my: 0.04522, time_cv: 0.048792, time_bruteforce: 0, good_nn: 0.211494, good_ratio: 0.984722, good_clusters: 0.997525, good_ratio_and_clusters: 0.998571
[       OK ] MATCHING.Scale110 (1579 ms)
[ RUN      ] MATCHING.Scale130
testing sift detector/descriptor...
flann matching...
cv flann matching...
filtering matches by ratio test...
filtering matches by clusters...
filtering matches by ratio & clusters
estimating homography...
estimateHomographyRANSAC : support: 680/831
estimateHomographyRANSAC : support: 736/831
estimateHomographyRANSAC : support: 779/831
estimateHomographyRANSAC : support: 796/831
estimateHomographyRANSAC : support: 831/831
estimateHomographyRANSAC : best support: 831/831
evaluating homography...
nn_score: 0, nn2_score: 0, nn_score_cv: 0, nn2_score_cv: 0, time_my: 0.08855, time_cv: 0.085822, time_bruteforce: 0, good_nn: 0.22072, good_ratio: 0.983587, good_clusters: 0.988258, good_ratio_and_clusters: 0.993983
testing my detector/descriptor...
flann matching...
cv flann matching...
filtering matches by ratio test...
filtering matches by clusters...
filtering matches by ratio & clusters
estimating homography...
estimateHomographyRANSAC : support: 493/733
estimateHomographyRANSAC : support: 733/733
estimateHomographyRANSAC : best support: 733/733
evaluating homography...
nn_score: 0, nn2_score: 0, nn_score_cv: 0, nn2_score_cv: 0, time_my: 0.066743, time_cv: 0.06483, time_bruteforce: 0, good_nn: 0.223851, good_ratio: 0.984085, good_clusters: 0.98441, good_ratio_and_clusters: 0.995907
[       OK ] MATCHING.Scale130 (2165 ms)
[ RUN      ] MATCHING.Scale150
testing sift detector/descriptor...
flann matching...
cv flann matching...
filtering matches by ratio test...
filtering matches by clusters...
filtering matches by ratio & clusters
estimating homography...
estimateHomographyRANSAC : support: 777/779
estimateHomographyRANSAC : support: 778/779
gauss: infinitely many solutions found
estimateHomographyRANSAC : support: 275/1253
estimateHomographyRANSAC : support: 291/1253
estimateHomographyRANSAC : support: 475/1253
estimateHomographyRANSAC : support: 581/1253
estimateHomographyRANSAC : support: 623/1253
estimateHomographyRANSAC : support: 637/1253
estimateHomographyRANSAC : best support: 637/1253
estimateHomographyRANSAC : support: 40/1925
estimateHomographyRANSAC : support: 586/1925
estimateHomographyRANSAC : support: 591/1925
gauss: infinitely many solutions found
gauss: xs0: 15.1506, 82.1042, 22.7183, 22.7183, 
gauss: ys0: 103.812, 684.571, 564.677, 564.677, 
gauss: infinitely many solutions found
gauss: xs0: 33.9382, 689.326, 400.03, 33.9382, 
gauss: ys0: 678.21, 158.474, 52.5446, 678.21, 
estimateHomographyRANSAC : support: 609/1925
estimateHomographyRANSAC : best support: 609/1925
estimateHomographyRANSAC : support: 22/1096
estimateHomographyRANSAC : support: 463/1096
estimateHomographyRANSAC : support: 481/1096
estimateHomographyRANSAC : support: 519/1096
estimateHomographyRANSAC : support: 522/1096
estimateHomographyRANSAC : support: 531/1096
estimateHomographyRANSAC : support: 543/1096
estimateHomographyRANSAC : best support: 543/1096
bbox: [1234.9, 864], [-209.009, -955.768]
n stable ortho kpts: : 20890
[       OK ] STITCHING.Orthophoto (12880 ms)
[----------] 2 tests from STITCHING (13256 ms total)

[----------] Global test environment tear-down
[==========] 20 tests from 2 test suites ran. (56104 ms total)
[  PASSED  ] 20 tests.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant