Цель данной работы - освоить следующие инструменты разработки программного обеспечения:
Основные задачи
-
Создать серверную копию рабочего репозитория, содержащего практические задания школы.
-
Создать локальную копию (на рабочей машине) репозитория, содержащего практические задания школы.
-
Настроить локальную копию репозитория для последующей синхронизации с сервером.
-
Разработать:
- приложение для открытия исходного изображения из файла и сохранения результирующего изображения в файл;
- фильтр для перевода изображения в оттенки серого;
- фильтр для изменения размера изображения.
-
Сделать "commit"(зафиксировать) разработанные методы в локальном репозитории.
-
Отправить "pull request" в основной репозиторий, содержащий шаблоны практических заданий школы.
Дополнительные задачи
- Разработать приложение для открытия изображение/видео/видеопотока с веб-камеры и вывода данных на экран.
- Разработать фильтр для случайного перемешивания частей картинки (см. игру "пятнашки").
- Реализовать фильтр для удаления шума методом Гаусса.
- Сделать форк upstream-репозитория.
- Клонировать origin-репозиторий к себе на локальную машину (раздел Общие инструкции по работе с Git).
- Собрать проект и проверить его работоспособность, запустив пример (раздел Сборка проекта с помощью CMake и MS VS).
- Создать рабочую ветку (раздел Общие инструкции по работе с Git).
- Реализовать отображение картинки на экране при помощи OpenCV. По мере готовности не забывайте выкладывать изменения в рабочую ветку на сервер.
- Реализовать фильтр, который будет переводить изображение в оттенки серого.
- Реализовать фильтр, который будет изменять размер изображения.
- Сделать Pull Request в upstream-репозиторий.
- Решить задачи списка Дополнительные задачи.
-
Сделать форк upstream-репозитория.
- Открыть в браузере upstream-репозиторий https://github.com/itlab-vision/CV-SUMMER-CAMP.
- В правом верхнем углу нажать кнопку Fork.
- Выбрать в качестве организации, куда направить форк, организацию,
соответствующую вашему аккаунту
@github-account
.
-
Клонировать origin-репозиторий к себе на локальную машину (раздел Общие инструкции по работе с Git).
- Открыть командную строку Git Bash (или Git Shell в зависимости от того, какой git-клиент установлен на вашей машине). Для этого необходимо найти соответствующий ярлык на рабочем столе или в меню "Пуск".
- Воспользоваться перечнем инструкций, описанных в разделе Общие инструкции по работе с Git).
-
Собрать проект и проверить его работоспособность, запустив проект practice1. (раздел Сборка проекта с помощью CMake и MS VS).
- Воспользоваться инструкцией по сборке и запуску, описанной в разделе [Сборка проекта с помощью CMake и MS VS][cmake-msvs]). - Запустить проект practice1 и удостовериться, что он успешно отработал. ```bash $ cd CV-SUMMER-CAMP-build/bin $ practice1.exe ```
-
Создать рабочую ветку (раздел Общие инструкции по работе с Git).
-
Релизовать фильтры:
- В файле
filter.h
объявить классGrayFilter
, наследника классаFilter
; - в файле
filter.cpp
реализовать методы классаGrayFilter
. - Важно! Реализовать метод
ProcessImage
, который возвращает изображение в оттенках серого. Подсказка: используйте фукнциюcvtColor
. - В файле
filter.h
обьявить классResizeFilter
, наследника классаFilter
; - в файле
filter.cpp
реализовать методы классаResizeFilter
. - Важно! реализовать конструктор, принимающий два параметра - новую ширину и высоту изображения;
- Важно! реализовать метод
ProcessImage
, который делает "ресайзинг" исходного изображения и возвращает результат. Подсказка: используйте функциюcvResize
.
- В файле
-
Создать копию файла
<project_source>/samples/practice1.cpp
и назвать ее<project_source>/samples/practice1_YOUR_NAME.cpp
. -
В файле
practice1_YOUR_NAME.cpp
реализовать чтение файла изображения при помощи имени файла, полученного из аргументов командной строки, и вывести это изображение на экран. -
Убедиться, что проект успешно собирается и создается новый исполняемый файл
<project_build>/bin/practice1_YOUR_NAME.exe
. -
В файле
practice1_YOUR_NAME.cpp
создать объект классаGrayFilter
, применить методProcessImage
к изображению, результат вывести на экран. -
В файле
practice1_YOUR_NAME.cpp
создать объект классаResizeFilter
, применить методProcessImage
к изображению, результат вывести на экран. Размеры изображения передаются аргументы командной строки. -
Прислать Pull Request с внесенными изменениями. Пометить в конце названия
(NOT READY)
. По мере готовности решений основных задач Pull Request можно будет переименовать. -
Решить задачи списка Дополнительные задачи.
В данном разделе описана типичная последовательность действий, которую
необходимо выполнить перед тем, как начать работать с проектом. Далее
для определенности используется репозиторий CV-SUMMER-CAMP
.
-
Создать аккаунт на github.com, если такой отсутствует. Для определенности обозначим аккаунт
github-account
. -
Сделать fork репозитория https://github.com/itlab-vision/CV-SUMMER-CAMP (в терминологии Git upstream-репозиторий) к себе в личный профиль с названием
github-account
. В результате будет создана копия репозитория https://github.com/github-account/CV-SUMMER-CAMP (origin-репозиторий). -
Клонировать origin репозиторий к себе на локальный компьютер, воспользовавшись следующей командой:
$ git clone https://github.com/ <github-account> /CV-SUMMER-CAMP
-
Перейти в директорию
CV-SUMMER-CAMP
:$ cd ./CV-SUMMER-CAMP
-
Настроить адрес upstream-репозитория (потребуется при обновлении локальной версии репозитория):
$ git remote add upstream https://github.com/itlab-vision/CV-SUMMER-CAMP
-
Настроить имя пользователя и e-mail, из под которого будут выполняться все операции с репозиторием Git:
$ git config --local user.name "github-account" $ git config --local user.email "github-email"
Примечание: если не выполнить указанную операцию при попытке размещения изменений на сервер, они попадут под аккаунтом пользователя компьютера.
-
Настроить редактор, который будет использован, если вносятся изменения в историю репозитория (в частности, при слиянии веток).
$ git config --local core.editor "'C:/Program Files (x86)/Notepad++/notepad++.exe' -n -w"
Когда сделан форк репозитория у вас создается по умолчанию единственная ветка master. Тем не менее, при решении независимых задач следует создавать рабочие ветки. Далее показаны основные команды для управления ветками на примере ветки
practice-1
. -
Получить список веток:
$ git branch [-v] # [-v] - список с информацией о последних коммитах
-
Создать ветку:
$ git branch practice-1
-
Создать ветку
practice-1
и перейти в нее:$ git checkout [-b] practice-1 # [-b] - создание и переход в ветку <branch_name>
-
Удалить ветку в локальном репозитории:
$ git branch -d <branch_name>
-
Удалить ветку на сервере:
$ git push [remotename] :[branch] # [remotename] - имя удалённого репозитория. Если следовать приведённой # инструкции, то origin - репозиторий пользователя github-account, upstream - # репозиторий itlab-vision/CV-SUMMER-CAMP
При работе с файлами в ветке необходимо управлять изменениями. Далее приведен
перечень основных команд в предположении, что текущей рабочей веткой
является practice-1
.
-
Получить список текущих изменений:
$ git status
-
Пометить файл как добавленный в текущую ветку репозитория (файл будет добавлен после выполнения команды
commit
):$ git add [<file_name>] # <file_name> - название файла для добавления в commit # если вместо имени указан символ *, то будут добавлены все новые файлы, # не совпадающие с масками, указанными в .gitignore
-
Добавить изменения в текущую ветку локального репозитория:
$ git commit [-m "<message_to_commit>"] [-a] # [-a] - автоматически добавляет изменения для существующих на сервере файлов # без выполнения команды git add # [--amend] - перезаписывает последний коммит (используется, если не забыты # изменения)
-
Разместить изменения, которые были добавлены в локальный репозиторий с помощью команды
commit
:$ git push [-u] origin [practice-1] # [-u] - отслеживать версию ветки [practice-1] на удалённом сервере # (origin). Позволяет получать изменения с сервера при помощи команды git pull # без явного указания имени удалённого репозитория и имени ветки.
-
Получить изменения с сервера при помощи команды
pull
и слить их с отслеживаемыми ветками:$ git pull [remotename [<branch name>]]
-
Удалить файлы или директории (!без опции
-f
для файлов, состояния которых совпадают с состояниям на сервере):$ git rm [-f] [--cached] # [-f] - принудительное удаление (файла с измененным состоянием) # [--cached] - удаление файлов на сервере, но не в локальной директории
-
Переименовать файлы (или 3 команды:
mv
,git rm
,git add
):$ git mv <file_from> <file_to>
Когда в проекте работает несколько человек, то вполне естественная ситуация - необходимость слияния изменений и разрешение конфликтов.
-
Слияние (вариант 1):
$ git merge upstream/master # слияние изменений из ветки upstream в master $ git merge master # слияние изменений из ветки master в текущую ветку
-
Слияние (вариант 2):
$ git checkout <branch_name> # переход в ветку <branch_name> (при необходимости) $ git rebase <base_branch> [<branch_name>] # слияние изменений из ветки <base_branch> в ветку <branch_name> $ git checkout <base_branch> $ git merge <branch_name>
-
Инструмент для разрешения конфликтов:
$ git mergetool
В данном разделе описана типичная последовательность действий, которую
необходимо выполнить для сборки проекта с использованием утилиты CMake и
Microsoft Visual Studio 2015 или Microsoft Visual Studio 2017.
Далее для определенности выполняется сборка проекта
из репозитория CV-SUMMER-CAMP
.
-
Рядом с директорией
CV-SUMMER-CAMP
создайтеCV-SUMMER-CAMP-build
. В новой директории будут размещены файлы решения и проектов, сгенерированные с помощью CMake.$ cd .. $ mkdir CV-SUMMER-CAMP-build
-
Перейдите в директорию
CV-SUMMER-CAMP-build
:$ cd ./CV-SUMMER-CAMP-build
-
Сгенерируйте файлы решения и проектов с помощью утилиты CMake. Для этого можно воспользоваться графическим приложением, входящим в состав утилиты, либо выполнить следующую команду:
$ cmake -DOpenCV_DIR="<OpenCVConfig.cmake-path>" -G <generator-name> <path-to-CV-SUMMER-CAMP> # <OpenCVConfig.cmake-path> - директория, в которой установлена # библиотека OpenCV и расположен файл OpenCVConfig.cmake # <generator-name> - название генератора, в случае тестовой # инфраструктуры участников школы может быть "Visual Studio 14 2015 Win64" # (если в командной строке набрать cmake без параметров, то можно просмотреть # список доступных генераторов) # <path-to-CV-SUMMER-CAMP> - путь до директории # CV-SUMMER-CAMP, где лежат исходные коды проекта (если предыдущие действия # выполнены корректно, то это директория`../CV-SUMMER-CAMP`)
Обратите внимание, что для сборки проекта необходима версия OpenCV 4.x, например, 4.1.0, которую можно скачать здесь. В терминал-классах OpenCV 4.1.0 установлена в директорию
С:\OpenCV41\opencv\build
С решения CV_SUMMER_CAMP.sln
. В терминал-классах
Microsoft Visual Studio располагается по пути:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe
или `C:\Program Files (x86)\Microsoft Visual Studio 15.0\Common7\IDE\devenv.exe
- Нажмите правой кнопкой мыши по проекту
ALL_BUILD
и выберите пунктRebuild
контекстного меню, чтобы собрать решение. В результате все бинарные файлы будут размещены в директорииCV-SUMMER-CAMP-build/bin
. - Для запуска приложения и тестов откройте командную строку (
cmd.exe
вПуск
) и перейдите в директорию с бинарными файлами, используя командуcd
. - Можно запустить шаблонное приложение
practice1.exe
. Возможное сообщение при запуске:The program can't start because opencv_world401.dll is missing from your computer. Try reinstalling the program to fix this problem.
. Решение 1: скопировать соответствующую библиотеку изС:\OpenCV41\opencv\build\x64\<vcXX>\bin
(где - версия Visual Studio, которую вы используете) к бинарным файлам проекта. Решение 2: добавить путьС:\OpenCV41\opencv\build\x64\<vcXX>\bin
в переменную окруженияPATH
.
Во время прохождения школы вы будете создавать приложения, в которых некоторые переменные, например пути к файлам, не зашиты во время компиляции, а передаются при помощи параметров запуска. Здесь можно поступать двумя способами.
-
Запуск с параметрами из командной строки. В проводнике необходимо открыть папку, в которой находится собранное вами приложение, и в строке путь набрать команду
cmd
. Откроется командная строка, в которой нужно набрать полное имя приложения, далле идут имена параметров и через знак=
значения параметров, например:$ sample.exe -i="../../СV-SUMMER-CAMP/data/unn_neuromobile.jpg"
-
Запуск с параметрами из Visual Studio. В этом случае необходимо открыть свойства проекта, выбрать правильную конфигурацию проекта (Debug, Release), далее в свойствах выбрать раздел меню
Debugging
, и в элементеDebugging Arguments
внести ваши параметры.
Список параметров для приложения задается в строке строке cmdOptions
, дополнительные параметры вам нужно добавить самостоятельно.
```cpp
const char* cmdOptions =
"{ i image | <none> | image to process }"
"{ w width | <none> | width for image resize }"
"{ h height | <none> | height for image resize }"
"{ q ? help usage | <none> | print help message }";
```
- В папке
src
расположен файлfilter.h
, который содержит объявление абстрактного классаFilter
, а также файлfilter.сpp
, в котором будут храниться реализации методов классов-наследников.ProcessImage
- виртуальный метод для фильтрации изображения. - В папке
samples
расположен файлpractice1.cpp
, в котором представлена функцияmain
- точка входа в программу.