Skip to content

Task04 Максим Федоров ИТМО#151

Closed
MartinezGitHub wants to merge 2 commits into
PhotogrammetryCourse:task04from
MartinezGitHub:task04
Closed

Task04 Максим Федоров ИТМО#151
MartinezGitHub wants to merge 2 commits into
PhotogrammetryCourse:task04from
MartinezGitHub:task04

Conversation

@MartinezGitHub
Copy link
Copy Markdown

@MartinezGitHub MartinezGitHub commented Jun 1, 2026

Перечислите идеи и коротко обозначьте мысли которые у вас возникали по мере выполнения задания, в частности попробуйте ответить на вопросы:

  1. test_ceres_solver/FitLine: почему найденная прямая и эталонная - не совпадают? Как это исправить пост-обработкой? Как это исправить формулировкой задачи?

Прямая не совпадает из-за неоднозначности масштаба параметров. При пост-обработке нужно нормализовать параметры перед сравнением. Формулировкой: задать прямую единичной нормалью и расстоянием до начала координат.

  1. BA: представьте что вы написали преобразование phg::Calibration -> блок параметров и обратное блок параметров -> phg::Calibration. Как проверить простым образом что эти преобразования сделаны корректно? Что должно быть в логе про процент inliers до/после BA если runBA() вызывать всегда два раза пордяд? Иначе говоря - что следует из того что в идеале runBA() должна быть (мне очень нравится это слово) - идемпотентна?

Проверить можно round-trip: calibration -> params -> calibration, значения должны совпасть в пределах погрешности. При двух вызовах runBA() подряд второй почти не должен менять inliers/MSE и параметры, потому что после первого BA решение уже близко к оптимуму.

  1. Какое максимальное число кадров у вас получилось хорошо выравнять для каждого из датасетов? (проверьте хотя бы saharov32 и herzjesu25) Не забудьте приложить скриншоты.

saharov32: получилось 32 кадра. herzjesu25: стабильно получилось 21 кадр, 25 не прошло по качеству инлаеров.

p4 p3 p2 p1
  1. Если бы вычисления в double были абсолютно точны - можно ли было бы назвать вычисления в Calibration::project/unproject строго зеркальными?

Нет. project добавляет радиальную дисторсию по формуле, а unproject убирает ее приближенно, итерациями. Поэтому это не строго зеркальные операции.

  1. Почему фокальная длина меняется от того что мы уменьшаем картинку? Почему именно f/downscale?

Потому что f измеряется в пикселях. При уменьшении картинки в downscale раз все пиксельные координаты масштабируются линейно, значит f / downscale

  1. Имеет ли право BA двигать точку отсчета системы координат (т.е. добавить константу ко всем координатам)? Как это повлияет на суммарную Loss?

Имеет, если вместе еще согласованно сдвинем камеры и точки. Loss не изменится, потому что относительная геометрия и проекции останутся теми же.

  1. Каким образом можно гарантировать чтобы при сравнении нескольких последовательно построенных облаков точек одного и того же датасета (созданных по мере добавления фотографии за фотографией) в MeshLab - облака не были хаотично смещены/отмасштабированы/повернуты друг от друга?

Можно зафиксировать одинаковую база для всех реконструкций. Для этого зафиксируем положение первой камеры, положение второй камеры и внутренние параметры камеры. Тогда система координат, масштаб и направление будут одинаковыми, а остальные камеры и 3D-точки будут достраиваться уже относительно этой общей основы.

Github Actions CI

$ ./build/test_sift
Running main() from /home/runner/work/PhotogrammetryTasks2026/PhotogrammetryTasks2026/libs/3rdparty/libgtest/googletest/src/gtest_main.cc
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from SFM
[ RUN      ] SFM.ReconstructNViews
32 images
detecting points...
matching points...
0% - Cameras 0-1 (IMG_3023.JPG-IMG_3024.JPG): 1159 matches
1% - Cameras 0-2 (IMG_3023.JPG-IMG_3025.JPG): 442 matches
1% - Cameras 0-3 (IMG_3023.JPG-IMG_3026.JPG): 148 matches
1% - Cameras 0-4 (IMG_3023.JPG-IMG_3027.JPG): 53 matches
2% - Cameras 8-3 (IMG_3031.JPG-IMG_3026.JPG): 21 matches
2% - Cameras 8-4 (IMG_3031.JPG-IMG_3027.JPG): 182 matches
2% - Cameras 8-5 (IMG_3031.JPG-IMG_3028.JPG): 361 matches
3% - Cameras 8-6 (IMG_3031.JPG-IMG_3029.JPG): 876 matches
3% - Cameras 8-7 (IMG_3031.JPG-IMG_3030.JPG): 1254 matches
4% - Cameras 8-9 (IMG_3031.JPG-IMG_3032.JPG): 1556 matches
4% - Cameras 8-10 (IMG_3031.JPG-IMG_3033.JPG): 661 matches
4% - Cameras 0-11 (IMG_3023.JPG-IMG_3034.JPG): 19 matches
4% - Cameras 8-11 (IMG_3031.JPG-IMG_3034.JPG): 191 matches
5% - Cameras 16-11 (IMG_3039.JPG-IMG_3034.JPG): 61 matches
5% - Cameras 16-12 (IMG_3039.JPG-IMG_3035.JPG): 171 matches
6% - Cameras 0-15 (IMG_3023.JPG-IMG_3038.JPG): 2 matches
6% - Cameras 16-13 (IMG_3039.JPG-IMG_3036.JPG): 367 matches
6% - Cameras 16-14 (IMG_3039.JPG-IMG_3037.JPG): 816 matches
7% - Cameras 16-15 (IMG_3039.JPG-IMG_3038.JPG): 1308 matches
7% - Cameras 16-17 (IMG_3039.JPG-IMG_3040.JPG): 1594 matches
7% - Cameras 24-19 (IMG_3047.JPG-IMG_3042.JPG): 14 matches
8% - Cameras 16-18 (IMG_3039.JPG-IMG_3041.JPG): 1082 matches
8% - Cameras 24-20 (IMG_3047.JPG-IMG_3043.JPG): 188 matches
8% - Cameras 24-21 (IMG_3047.JPG-IMG_3044.JPG): 401 matches
8% - Cameras 16-19 (IMG_3039.JPG-IMG_3042.JPG): 332 matches
8% - Cameras 24-22 (IMG_3047.JPG-IMG_3045.JPG): 992 matches
9% - Cameras 24-23 (IMG_3047.JPG-IMG_3046.JPG): 1327 matches
9% - Cameras 16-20 (IMG_3039.JPG-IMG_3043.JPG): 51 matches
9% - Cameras 24-25 (IMG_3047.JPG-IMG_3048.JPG): 1327 matches
10% - Cameras 24-26 (IMG_3047.JPG-IMG_3049.JPG): 688 matches
10% - Cameras 24-27 (IMG_3047.JPG-IMG_3050.JPG): 324 matches
10% - Cameras 0-28 (IMG_3023.JPG-IMG_3051.JPG): 515 matches
10% - Cameras 24-28 (IMG_3047.JPG-IMG_3051.JPG): 94 matches
11% - Cameras 0-29 (IMG_3023.JPG-IMG_3052.JPG): 917 matches
11% - Cameras 0-30 (IMG_3023.JPG-IMG_3053.JPG): 2339 matches
11% - Cameras 0-31 (IMG_3023.JPG-IMG_3054.JPG): 1154 matches
Camera #15 center: [0.987989, 0.617716, 7.91738] -> [0.990277, 0.613161, 7.92495]
Camera #16 center: [1.78431, 0.592042, 7.65275] -> [1.78571, 0.587455, 7.65913]
Camera #17 center: [2.49161, 0.536696, 7.13957] -> [2.49125, 0.531835, 7.14599]
Camera #18 center: [3.0286, 0.49521, 6.51877] -> [3.02781, 0.489596, 6.52512]
Camera #19 center: [3.53441, 0.466637, 5.91194] -> [3.53365, 0.459827, 5.91828]
Camera #20 center: [4.04491, 0.418773, 5.28453] -> [4.04355, 0.412198, 5.29109]
Camera #21 center: [4.26192, 0.355476, 4.50284] -> [4.26117, 0.347357, 4.5102]
Camera #22 center: [4.32396, 0.278279, 3.73238] -> [4.32385, 0.269584, 3.74124]
Camera #23 center: [4.16915, 0.215631, 3.0554] -> [4.17074, 0.206501, 3.06717]
Camera #24 center: [3.94543, 0.158051, 2.38908] -> [3.94885, 0.147734, 2.40017]
Camera #25 center: [3.51594, 0.130741, 1.82273] -> [3.5219, 0.113467, 1.83136]
Camera #26 center: [2.99871, 0.0559965, 1.23348] -> [2.99894, 0.0482453, 1.23685]
Camera #27 center: [2.3998, 0.0328211, 0.777164] -> [2.39718, 0.0344304, 0.781755]
Camera #28 center: [1.71966, 0.00839668, 0.328534] -> [1.7173, 0.0102642, 0.334709]
Camera #29 center: [0.925998, 0.00268695, 0.0537546] -> [0.926047, 0.00478797, 0.0584792]
Camera #30 center: [0.164595, -4.82072e-06, -0.0985708] -> [0.16474, 0.00304898, -0.0913163]
Camera #31 center: [-0.629122, -0.0046346, -0.080229] -> [-0.636722, -0.00258494, -0.068121]
After BA tie poits: 46% old + 2% new = 48% total outliers
After BA projections: 63% inliers with MSE=0.119615
    Camera #0 projections: 62% inliers (1908/3085) with MSE=0.387171
    Camera #1 projections: 76% inliers (1957/2561) with MSE=0.357985
    Camera #2 projections: 71% inliers (1862/2616) with MSE=0.18199
    Camera #3 projections: 61% inliers (1706/2792) with MSE=0.159805
    Camera #4 projections: 57% inliers (1844/3262) with MSE=0.146991
    Camera #5 projections: 53% inliers (1726/3257) with MSE=0.113392
    Camera #6 projections: 59% inliers (2103/3561) with MSE=0.10918
    Camera #7 projections: 66% inliers (2025/3059) with MSE=0.0828653
    Camera #8 projections: 61% inliers (1978/3239) with MSE=0.0790137
    Camera #9 projections: 59% inliers (1988/3384) with MSE=0.0703303
    Camera #10 projections: 58% inliers (1911/3287) with MSE=0.0685754
    Camera #11 projections: 52% inliers (1572/3026) with MSE=0.117103
    Camera #12 projections: 39% inliers (1008/2554) with MSE=0.0980919
    Camera #13 projections: 48% inliers (1158/2389) with MSE=0.0641034
    Camera #14 projections: 61% inliers (1428/2344) with MSE=0.0611677
    Camera #15 projections: 52% inliers (1688/3254) with MSE=0.057231
    Camera #16 projections: 49% inliers (1905/3891) with MSE=0.0636306
    Camera #17 projections: 45% inliers (1896/4176) with MSE=0.053923
    Camera #18 projections: 50% inliers (1711/3432) with MSE=0.0784245
    Camera #19 projections: 61% inliers (1656/2706) with MSE=0.085134
    Camera #20 projections: 64% inliers (1274/1976) with MSE=0.100009
    Camera #21 projections: 61% inliers (1112/1815) with MSE=0.0817114
    Camera #22 projections: 55% inliers (1284/2327) with MSE=0.0811487
    Camera #23 projections: 54% inliers (1532/2847) with MSE=0.0725714
    Camera #24 projections: 61% inliers (1929/3137) with MSE=0.0580213
    Camera #25 projections: 72% inliers (2142/2994) with MSE=0.0529997
    Camera #26 projections: 82% inliers (2224/2698) with MSE=0.0594389
    Camera #27 projections: 85% inliers (2201/2586) with MSE=0.0733555
    Camera #28 projections: 85% inliers (2145/2529) with MSE=0.155817
    Camera #29 projections: 88% inliers (2431/2766) with MSE=0.215318
    Camera #30 projections: 77% inliers (3628/4720) with MSE=0.147795
    Camera #31 projections: 94% inliers (4132/4404) with MSE=0.139323
[       OK ] SFM.ReconstructNViews (199159 ms)
[----------] 1 test from SFM (199159 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (199159 ms total)
[  PASSED  ] 1 test.

@simiyutin
Copy link
Copy Markdown
Contributor

задача зачтена, 8/10 баллов

@simiyutin simiyutin closed this Jun 2, 2026
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.

2 participants