Skip to content

Commit 91387d1

Browse files
committed
Merge branch 'task01' of github.com:PhotogrammetryCourse/PhotogrammetryTasks2026 into task01
2 parents 9998fc5 + 0c7958f commit 91387d1

20 files changed

Lines changed: 795 additions & 576 deletions

.clang-format

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# .clang-format
2+
BasedOnStyle: WebKit
3+
4+
ColumnLimit: 239

.github/pull_request_template.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// Убедитесь что название PR соответствует шаблону:
2-
// Task01 <Имя> <Фамилия> <ВУЗ>
2+
// Task01 <ИмяНаРусском> <ФамилияНаРусском> <ВУЗ>
33

44
// Проверьте что обе ветки PR - task01 (отправляемая из вашего форкнутого репозитория и та в которую вы отправляете PR)
55

@@ -38,11 +38,12 @@ Running main() from /home/runner/work/PhotogrammetryTasks2023/PhotogrammetryTask
3838
[ RUN ] SIFT.MovedTheSameImage
3939
[ORB_OCV] Points detected: 500 -> 500 (in 0.021269 sec)
4040
...
41-
[ OK ] SIFT.HerzJesu19RotateM40 (7730 ms)
42-
[----------] 22 tests from SIFT (12918 ms total)
41+
Final score: 239001
42+
[ OK ] SIFT.PairMatching (0 ms)
43+
[----------] 25 tests from SIFT (7264 ms total)
4344
[----------] Global test environment tear-down
44-
[==========] 22 tests from 1 test suite ran. (12918 ms total)
45-
[ PASSED ] 22 tests.
45+
[==========] 25 tests from 1 test suite ran. (7264 ms total)
46+
[ PASSED ] 25 tests.
4647
</pre>
4748

4849
</p></details>

.github/scripts/install_opencv451.sh

Lines changed: 0 additions & 10 deletions
This file was deleted.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#!/bin/bash
2+
set -euo pipefail
3+
4+
wget https://github.com/opencv/opencv/archive/4.11.0.zip
5+
unzip 4.11.0.zip
6+
cd opencv-4.11.0
7+
8+
echo "Configuring OpenCV..."
9+
mkdir build
10+
cd build
11+
cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo \
12+
-DBUILD_LIST=features2d,highgui,flann,calib3d,imgcodecs \
13+
-DWITH_OPENEXR=ON -DBUILD_EXAMPLES=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_TESTS=OFF \
14+
-DCMAKE_INSTALL_PREFIX=/opt/opencv-4.11.0 ..
15+
16+
echo "Building OpenCV..."
17+
make -j"$(nproc)"
18+
19+
echo "Installing OpenCV..."
20+
sudo make install
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
curl -L "https://github.com/opencv/opencv/archive/4.11.0.zip" -o "4.11.0.zip"
5+
unzip 4.11.0.zip
6+
cd opencv-4.11.0
7+
8+
echo "Configuring OpenCV..."
9+
mkdir build;
10+
cd build
11+
cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo \
12+
-DBUILD_LIST=features2d,highgui,flann,calib3d,imgcodecs \
13+
-DWITH_OPENEXR=ON -DBUILD_EXAMPLES=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_TESTS=OFF \
14+
-DCMAKE_INSTALL_PREFIX=/opt/opencv-4.11.0 ..
15+
16+
echo "Building OpenCV..."
17+
make -j"$(sysctl -n hw.ncpu)"
18+
19+
echo "Installing OpenCV..."
20+
sudo make install
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
# Prereqs: cmake + libomp for OpenMP (project requires find_package(OpenMP))
5+
if ! command -v brew >/dev/null 2>&1; then
6+
echo "Homebrew not found. Install Homebrew first: https://brew.sh/"
7+
exit 1
8+
fi
9+
10+
brew update
11+
brew install cmake pkg-config libomp || true
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
$ErrorActionPreference = "Stop"
2+
3+
$RepoRoot = $env:GITHUB_WORKSPACE
4+
if ([string]::IsNullOrEmpty($RepoRoot)) {
5+
$RepoRoot = (Resolve-Path (Join-Path $PSScriptRoot "..\..\..")).Path
6+
}
7+
$DepsRoot = Join-Path $RepoRoot ".deps"
8+
$OcvVer = "4.11.0"
9+
10+
$ZipPath = Join-Path $DepsRoot "opencv-$OcvVer.zip"
11+
$SrcDir = Join-Path $DepsRoot "opencv-$OcvVer"
12+
$BuildDir = Join-Path $DepsRoot "opencv-build-$OcvVer"
13+
$InstDir = Join-Path $DepsRoot "opencv-install-$OcvVer"
14+
15+
New-Item -ItemType Directory -Force -Path $DepsRoot | Out-Null
16+
17+
# Download OpenCV sources
18+
if (-not (Test-Path $ZipPath)) {
19+
Write-Host "Downloading OpenCV $OcvVer..."
20+
Invoke-WebRequest -Uri "https://github.com/opencv/opencv/archive/$OcvVer.zip" -OutFile $ZipPath
21+
}
22+
23+
# Extract
24+
if (-not (Test-Path $SrcDir)) {
25+
Write-Host "Extracting..."
26+
Expand-Archive -Path $ZipPath -DestinationPath $DepsRoot -Force
27+
}
28+
29+
New-Item -ItemType Directory -Force -Path $BuildDir | Out-Null
30+
New-Item -ItemType Directory -Force -Path $InstDir | Out-Null
31+
32+
# Configure (VS2022)
33+
Write-Host "Configuring OpenCV..."
34+
& cmake -S $SrcDir -B $BuildDir -G "Visual Studio 17 2022" -A x64 `
35+
"-DCMAKE_INSTALL_PREFIX=$InstDir" `
36+
"-DCMAKE_CONFIGURATION_TYPES=Debug;Release" `
37+
"-DINSTALL_CREATE_DISTRIB=ON" `
38+
"-DBUILD_LIST=features2d,highgui,flann,calib3d,imgcodecs" `
39+
"-DWITH_OPENEXR=ON" `
40+
"-DBUILD_EXAMPLES=OFF" "-DBUILD_PERF_TESTS=OFF" "-DBUILD_TESTS=OFF" "-DBUILD_DOCS=OFF" `
41+
"-DWITH_CUDA=OFF"
42+
43+
# Build + install both configs (your project uses Release in CI)
44+
Write-Host "Building+Installing OpenCV Release..."
45+
& cmake --build $BuildDir --config Release --target INSTALL
46+
47+
Write-Host "Building+Installing OpenCV Debug..."
48+
& cmake --build $BuildDir --config Debug --target INSTALL
49+
50+
# Find OpenCVConfig.cmake and write OpenCV_DIR
51+
$cfg = Get-ChildItem -Path $InstDir -Recurse -Filter OpenCVConfig.cmake | Select-Object -First 1
52+
if ($null -eq $cfg) { throw "OpenCVConfig.cmake not found under $InstDir" }
53+
54+
$OpenCV_DIR = $cfg.Directory.FullName
55+
Set-Content -Path (Join-Path $DepsRoot "opencv_dir.txt") -Value $OpenCV_DIR -Encoding ASCII
56+
57+
# Stable bin path for runtime (opencv_world*.dll)
58+
$ocvBin = Join-Path $InstDir "x64\vc17\bin"
59+
if (Test-Path $ocvBin) {
60+
Set-Content -Path (Join-Path $DepsRoot "opencv_bin.txt") -Value $ocvBin -Encoding ASCII
61+
} else {
62+
# Fallback: search first opencv_world*.dll and use its folder
63+
$dll = Get-ChildItem -Path $InstDir -Recurse -Filter "opencv_world*.dll" | Select-Object -First 1
64+
if ($dll) {
65+
Set-Content -Path (Join-Path $DepsRoot "opencv_bin.txt") -Value $dll.Directory.FullName -Encoding ASCII
66+
}
67+
}
68+
69+
Write-Host "OpenCV_DIR = $OpenCV_DIR"

.github/workflows/cmake.yml

Lines changed: 68 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,81 @@ env:
77

88
jobs:
99
build:
10-
runs-on: ubuntu-22.04
10+
strategy:
11+
fail-fast: false
12+
matrix:
13+
os: [ubuntu-24.04, macos-14, windows-2022]
14+
runs-on: ${{ matrix.os }}
1115

1216
steps:
13-
- uses: actions/checkout@v2
17+
- uses: actions/checkout@v4
1418

15-
- name: Install prerequisites
19+
- name: Build and install OpenCV (Linux)
20+
if: runner.os == 'Linux'
1621
run: |
1722
sudo apt update
18-
sudo apt install -y g++
19-
sudo apt install -y cmake
23+
sudo apt install -y g++ cmake unzip wget
24+
bash .github/scripts/linux/install_opencv.sh
2025
21-
- name: Build and install OpenCV 4.5.1
22-
run: sudo bash .github/scripts/install_opencv451.sh;
26+
- name: Build and install OpenCV + OpenMP (macOS)
27+
if: runner.os == 'macOS'
28+
run: |
29+
bash .github/scripts/macos/install_openmp.sh
30+
bash .github/scripts/macos/install_opencv.sh
31+
32+
- name: Build and install OpenCV (Windows)
33+
if: runner.os == 'Windows'
34+
shell: pwsh
35+
run: .github/scripts/windows/install_opencv.ps1
36+
37+
- name: Configure CMake (Linux)
38+
if: runner.os == 'Linux'
39+
run: |
40+
cmake -S . -B build \
41+
-DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \
42+
-DOpenCV_DIR="/opt/opencv-4.11.0/lib/cmake/opencv4"
43+
44+
- name: Configure CMake (macOS)
45+
if: runner.os == 'macOS'
46+
run: |
47+
cmake -S . -B build \
48+
-DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \
49+
-DOpenCV_DIR="/opt/opencv-4.11.0/lib/cmake/opencv4" \
50+
-DOpenMP_ROOT="$(brew --prefix libomp)"
2351
24-
- name: Configure CMake
25-
run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
52+
- name: Configure CMake (Windows)
53+
if: runner.os == 'Windows'
54+
shell: pwsh
55+
run: |
56+
$OpenCV_DIR = Get-Content .deps/opencv_dir.txt
57+
cmake -S . -B build -G "Visual Studio 17 2022" -A x64 -DOpenCV_DIR="$OpenCV_DIR" `
58+
-DCMAKE_CONFIGURATION_TYPES="Debug;RelWithDebInfo"
2659
27-
- name: Build
60+
- name: Build (any OS)
2861
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
2962

30-
- name: test_sift
31-
working-directory: ${{github.workspace}}
32-
run: ./build/test_sift
63+
- name: Run test_sift (Linux/macOS)
64+
if: runner.os != 'Windows'
65+
run: ./build/test_sift
66+
67+
- name: Copy OpenCV/gtest DLLs (Windows)
68+
if: runner.os == 'Windows'
69+
shell: pwsh
70+
run: |
71+
$cfg = "${{ env.BUILD_TYPE }}"
72+
$exeDir = Join-Path $pwd "build\$cfg"
73+
74+
# OpenCV DLLs (from your install script output)
75+
$ocvBin = Get-Content .deps/opencv_bin.txt
76+
Copy-Item "$ocvBin\opencv_world*.dll" $exeDir -Force
77+
78+
# gtest DLLs (exclude destination dir to avoid copying onto itself)
79+
Get-ChildItem -Path build -Recurse -Filter "gtest*.dll" |
80+
Where-Object { $_.DirectoryName -ne $exeDir } |
81+
Group-Object Name |
82+
ForEach-Object { Copy-Item $_.Group[0].FullName $exeDir -Force }
83+
84+
- name: Run test_sift (Windows)
85+
if: runner.os == 'Windows'
86+
shell: pwsh
87+
run: .\build\${{ env.BUILD_TYPE }}\test_sift.exe

CMakeLists.txt

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
cmake_minimum_required(VERSION 3.1)
1+
cmake_minimum_required(VERSION 3.20)
22

33
add_subdirectory(libs)
44

@@ -9,39 +9,41 @@ set(CMAKE_CXX_STANDARD 17)
99
# OpenMP позволит распараллеливать циклы на все ядра процессора простыми директивами
1010
find_package(OpenMP)
1111
if (OpenMP_CXX_FOUND)
12-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
13-
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
14-
else()
12+
message(STATUS "OpenMP found")
13+
else ()
1514
message(FATAL_ERROR "OpenMP not found! You need OpenMP for speedup on multicore CPUs!")
16-
endif()
17-
18-
find_package(OpenCV 4.5.1 REQUIRED)
19-
# Linux:
20-
# скачайте Source code (opencv-4.5.1.zip)(для ubuntu 24.04 может быть лучше использовать 4.11.0) отсюда - https://github.com/opencv/opencv/releases распакуйте и скомпилируйте:
21-
# wget https://github.com/opencv/opencv/archive/4.5.1.zip
22-
# unzip 4.5.1.zip
23-
# cd opencv-4.5.1
24-
# mkdir build
25-
# cd build
26-
# cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBUILD_LIST=features2d,highgui,flann,calib3d,imgcodecs -DWITH_OPENEXR=ON -DBUILD_EXAMPLES=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_TESTS=OFF -DCMAKE_INSTALL_PREFIX=/opt/opencv451 ..
27-
# make -j12
28-
# sudo make install
15+
endif ()
16+
17+
find_package(OpenCV 4.11.0 REQUIRED)
18+
# в целом "как выполнить сборку OpenCV и проекта" можно узнать посмотрев на GitHub CI,
19+
# который выполняет сборку и исполнение на linux/windows/macos
20+
# описание шагов - в .github/workflows/cmake.yml
21+
#
22+
# Linux: (рекомендуется Ubuntu 22.04/24.04, на крайний случай - в виртуалке)
23+
# sudo .github/scripts/install_opencv_linux.sh
2924
# укажите для CMake путь к OpenCV:
30-
# в CLion это делается через File->Settings->Build, Execution, Deployment->CMake->CMake options: -DOpenCV_DIR=/opt/opencv451/lib/cmake/opencv4
25+
# в CLion это делается через File->Settings->Build, Execution, Deployment->CMake->CMake options: -DOpenCV_DIR=/opt/opencv-4.11.0/lib/cmake/opencv4
3126
# там же сразу стоит добавить в дополнению к Debug сборке - сборку с включенными оптимизациями и отладочными символами - RelWithDebInfo
3227
#
3328
# Windows: (но рекомендуется использовать Linux)
34-
# Скачайте этот скрипт и следуйте инструкции - https://gist.github.com/PolarNick239/18036d942ae4b9aad9f1da756ce6c845#file-buildocv-sh-L10-L33
29+
# выполните в powershell .github/scripts/windows/install_opencv.ps1
30+
# альтернативно вы можете следовать инструкции - https://gist.github.com/PolarNick239/18036d942ae4b9aad9f1da756ce6c845#file-buildocv-sh-L10-L33
31+
#
32+
# MacOS: (но рекомендуется использовать Linux, MacOS не тестировался, только на github CI, а инструкция является галлюцинацией LLM)
33+
# sudo bash .github/scripts/macos/install_openmp.sh
34+
# bash .github/scripts/macos/install_opencv.sh
35+
# cmake -S . -B build -DCMAKE_BUILD_TYPE=RelWithDebInfo -DOpenCV_DIR=/opt/opencv-4.11.0/lib/cmake/opencv4 -DOpenMP_ROOT="$(brew --prefix libomp)"
3536

3637
set(SOURCES
3738
src/phg/sift/sift.cpp
3839
src/phg/sift/sift.h
39-
)
40+
)
4041

4142
set(LIBRARIES
4243
libutils
4344
${OpenCV_LIBS}
44-
)
45+
OpenMP::OpenMP_CXX
46+
)
4547

4648
add_library(${PROJECT_NAME} ${SOURCES})
4749
target_link_libraries(${PROJECT_NAME} ${LIBRARIES})
@@ -50,12 +52,12 @@ target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_SOURCE_DIR}/src)
5052
set(TEST_SOURCES
5153
tests/utils/test_utils.cpp
5254
tests/utils/test_utils.h
53-
)
55+
)
5456

5557
set(TEST_LIBRARIES
5658
gtest
5759
gtest_main
58-
)
60+
)
5961

6062
add_executable(test_sift tests/test_sift.cpp ${TEST_SOURCES})
6163
target_link_libraries(test_sift ${PROJECT_NAME} ${LIBRARIES} ${TEST_LIBRARIES})

README.md

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
1-
В этом репозитории предложены задания курса по Фотограмметрии для студентов МКН/ИТМО/ВШЭ.
1+
В этом репозитории предложены задания курса по Фотограмметрии для студентов МКН/ИТМО/ВШЭ/CsSpace.
22

3-
[Остальные задания](https://github.com/PhotogrammetryCourse/PhotogrammetryTasks2025/).
3+
[Остальные задания](https://github.com/PhotogrammetryCourse/PhotogrammetryTasks2026/).
44

55
# Задание 1. Локальные ключевые точки SIFT (детектор и дескриптор)
66

7-
[![Build Status](https://github.com/PhotogrammetryCourse/PhotogrammetryTasks2025/actions/workflows/cmake.yml/badge.svg?branch=task01&event=push)](https://github.com/PhotogrammetryCourse/PhotogrammetryTasks2025/actions/workflows/cmake.yml)
7+
[![Build Status](https://github.com/PhotogrammetryCourse/PhotogrammetryTasks2026/actions/workflows/cmake.yml/badge.svg?branch=task01&event=push)](https://github.com/PhotogrammetryCourse/PhotogrammetryTasks2026/actions/workflows/cmake.yml)
88

99
0. Сделать fork проекта (обратите внимание что задание не в ветке **master**, а в ветке **task01**)
10-
1. [Установите OpenCV 4.5.1](https://github.com/PhotogrammetryCourse/PhotogrammetryTasks2025/blob/task01/CMakeLists.txt#L19-L31)
10+
1. [Установите OpenCV 4.11.0](https://github.com/PhotogrammetryCourse/PhotogrammetryTasks2026/blob/task01/CMakeLists.txt#L18-L35)
1111
2. Выполнить задания ниже (при тестировании Github Actions CI использует GCC 11, поэтому если вы используете фичи свежее чем C++17 - есть риск что не скомпилируется, в таком случае поправьте пожалуйста)
12-
3. Отправить **Pull-request** с названием```Task01 <Имя> <Фамилия> <Аффиляция>```:
12+
3. Отправить **Pull-request** с названием ```Task01 <ИмяНаРусском> <ФамилияНаРусском> <Аффиляция>```:
1313

14-
- Скопируйте в описание [шаблон](https://raw.githubusercontent.com/PhotogrammetryCourse/PhotogrammetryTasks2025/task01/.github/pull_request_template.md)
14+
- Скопируйте в описание [шаблон](https://raw.githubusercontent.com/PhotogrammetryCourse/PhotogrammetryTasks2026/task01/.github/pull_request_template.md)
1515
- Обязательно отправляйте PR из вашей ветки **task01** (вашего форка) в ветку **task01** (основного репозитория)
1616
- Перечислите свои мысли по вопросам поднятым в коде и просто появившиеся в процессе выполнения задания (выписывайте их с самого начала в отдельный текстовый файл, в шаблоне предложены некоторые вопросы)
1717
- Создайте PR
18-
- Затем дождавшись отработку Github Actions CI (около 15 минут) - скопируйте в описание PR вывод исполнения вашей программы **на CI** (через редактирование описания PR)
18+
- Затем дождавшись отработку Github Actions CI (около 15 минут) - скопируйте в описание PR вывод исполнения вашей программы **на CI любой OS** (через редактирование описания PR)
1919

20-
**Мягкий дедлайн**: начало лекции 27 февраля. Мягкий дедлайн - ориентировочная рекомендация "здорово если успеете".
20+
**Мягкий дедлайн**: 23:59 27 февраля. Мягкий дедлайн - ориентировочная рекомендация "здорово если успеете".
2121

22-
**Жесткий дедлайн**: начало лекции 5 марта. Жесткий дедлайн - предполагается что все в него укладываются. Не доделали - зашлите хотя бы что-то. После дедлайна досылать тоже можно (но будет небольшой штраф в баллах).
22+
**Жесткий дедлайн**: 23:59 6 марта. Жесткий дедлайн - предполагается что все в него укладываются. Не доделали - зашлите хотя бы что-то. После дедлайна - штраф в баллах.
2323

2424
Задание 1.0.
2525
=========
@@ -57,6 +57,5 @@
5757

5858
Реализуйте SIFT в ```src/phg/sift/sift.cpp```:
5959

60-
- Либо с чистого листа самостоятельно - просто удалите оттуда весь код (тогда если все хорошо - **10 баллов**)
61-
- Либо выполняя **TODO** один за другим (через Ctrl+F сверху вниз) (тогда если все хорошо - **8 баллов**)
62-
- Либо выполняя **TODO** один за другим, а если на каких-то отдельных этапах вы хотите сделать больше самостоятельно - смело удаляйте окружающий код заготовки :) (тоже если все хорошо - **8 баллов**)
60+
- Выполняя **TODO** один за другим (через Ctrl+F сверху вниз) (тогда если все хорошо - **10 баллов**)
61+
- Тест PairMatching выдает *Final score*. Топ 3 результатов получат баллы ПРЕСТИЖА в размере +3, +2, +1.

0 commit comments

Comments
 (0)