Цель данной работы - освоить следующие инструменты разработки программного обеспечения:
- Утилита CMake для сборки исходных кодов.
- Система контроля версий Git.
- Google Testing Framework.
Основные задачи
- Создать собственную копию (на сервере) для рабочего репозитория, содержащего практические задания школы.
- Создать локальную копию (на рабочей машине) репозитория, содержащего практические задания школы.
- Настроить локальную копию репозитория для последующей синхронизации версии с сервером.
- Реализовать функцию отсечения элементов двумерного массива типа
unsigned char
. Предполагается, что двумерный массив развернут в одномерный по строкам. Функция отсечения заменяет каждое значение на 0, если текущее значение элемента меньше заданного порога. - Разработать тесты для реализованной функции отсечения.
- Закоммитить разработанную функцию в локальный репозиторий.
- Отправить Pull Request в основной репозиторий, содержащий шаблоны практических заданий школы.
Дополнительные задачи
- Реализовать функцию усреднения элементов в заданной окрестности.
Например, если
src[i, j]
- исходное значение элемента (i
,j
) и размер окрестности равен 1, то новое значение элемента вычисляется согласно формуле, приведенной ниже.
dst[i, j] = (src[i - 1, j - 1] + src[i - 1, j] + src[i - 1, j + 1] +
src[i, j - 1] + src[i, j] + src[i, j + 1] +
src[i + 1, j - 1] + src[i + 1, j] + src[i + 1, j + 1]) / 9
В общем случае, `dst[i, j]` равно среднему арифметическому элементов `src[i + t, j + s]`
при `t=-k..k` и `s=-k..k`, где `k` - размер окрестности.
- Реализовать функцию медианной фильтрации изображения.
dst[i, j]
равно среднему по величине элементу окрестностиsrc[i + t, j + s]
,t=-k..k
иs=-k..k
, гдеk
- размер окрестности.
- Сделать форк upstream-репозитория.
- Клонировать origin-репозиторий к себе на локальную машину (раздел Общие инструкции по работе с Git).
- Собрать проект и проверить его работоспособность, запустив тесты и пример (раздел Сборка проекта с помощью CMake и MS VS).
- Создать рабочую ветку (раздел Общие инструкции по работе с Git).
- Реализовать функцию отсечения элементов двумерного массива типа
unsigned char
. По мере готовности не забывайте выкладывать изменения в рабочую ветку на сервер. - Разработать тесты для реализованной функции отсечения.
- Сделать Pull Request в upstream-репозиторий.
- Решить задачи списка Дополнительные задачи.
В данном разделе описана типичная последовательность действий, которую
необходимо выполнить перед тем, как начать работать с проектом. Далее
для определенности используется репозиторий itseez-ss-2016-practice
.
-
Создать аккаунт на github.com, если такой отсутствует. Для определенности обозначим аккаунт
github-account
. -
Сделать fork репозитория https://github.com/itseez-academy/itseez-ss-2016-practice (в терминологии Git upstream-репозиторий) к себе в личный профиль с названием
github-account
. В результате будет создана копия репозитория https://github.com/github-account/itseez-ss-2016-practice (origin-репозиторий). -
Клонировать origin репозиторий к себе на локальный компьютер, воспользовавшись следующей командой:
$ git clone https://github.com/github-account/itseez-ss-2016-practice
- Перейти в директорию
itseez-ss-2016-practice
:
$ cd ./itseez-ss-2016-practice
- Настроить адрес upstream-репозитория (потребуется при обновлении локальной версии репозитория):
$ git remote add upstream https://github.com/itseez-academy/itseez-ss-2016-practice
- Настроить имя пользователя и 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/sublime text 2/sublime_text.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 -
# репозиторий itseez-academy/itseez-ss-2016-practice
При работе с файлами в ветке необходимо управлять изменениями. Далее приведен
перечень основных команд в предположении, что текущей рабочей веткой
является 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. Далее для определенности выполняется сборка проекта
из репозитория itseez-ss-2016-practice
.
-
Рядом с директорией
itseez-ss-2016-practice
создайтеitseez-ss-2016-practice-build
. В новой директории будут размещены файлы решения и проектов, сгенерированные с помощью CMake.$ cd .. $ mkdir itseez-ss-2016-practice-build
-
Перейдите в директорию
itseez-ss-2016-practice-build
:$ cd ./itseez-ss-2016-practice-build
-
Сгенерируйте файлы решения и проектов с помощью утилиты CMake. Для этого можно воспользоваться графическим приложением, входящим в состав утилиты, либо выполнить следующую команду:
$ cmake -DOpenCV_DIR="<OpenCVConfig.cmake-path>" -G <generator-name> <path-to-itseez-ss-2016-practice>
# <OpenCVConfig.cmake-path> - директория, в которой установлена
# библиотека OpenCV и расположен файл OpenCVConfig.cmake
# <generator-name> - название генератора, в случае тестовой
# инфраструктуры участников школы может быть "Visual Studio 14 2015 Win64"
# (если в командной строке набрать cmake без параметров, то можно просмотреть
# список доступных генераторов)
# <path-to-itseez-ss-2016-practice> - путь до директории
# itseez-ss-2016-practice, где лежат исходные коды проекта (если предыдущие действия
# выполнены корректно, то это директория`../itseez-ss-2016-practice`)
Обратите внимание, что для сборки проекта необходима версия OpenCV 3.1.x,
например, 3.1.0, которую можно скачать здесь.
В терминал-классах OpenCV 3.1.0 установлена в директорию C:\OpenCV31
- Откройте сгенерированный файл решения
summer_school_2016.sln
. В терминал-классах Microsoft Visual Studio располагается по пути:C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe
- Нажмите правой кнопкой мыши по проекту
ALL_BUILD
и выберите пунктRebuild
контекстного меню, чтобы собрать решение. В результате все бинарные файлы будут размещены в директорииitseez-ss-2016-practice-build/bin
. - Для запуска приложения и тестов откройте командную строку (
cmd.exe
вПуск
) и перейдите в директорию с бинарными файлами, используя командуcd
. - Можно запустить шаблонное приложение
template_demo.exe
. Возможное сообщение при запуске:The program can't start because opencv_world310.dll is missing from your computer. Try reinstalling the program to fix this problem.
. Решение 1: скопировать соответствующую библиотеку изC:\OpenCV31\opencv\build\x64\vc14\bin
к бинарным файлам проекта. Решение 2: добавить путьC:\OpenCV31\opencv\build\x64\vc14\bin
в переменную окруженияPATH
. - По аналогии следует запустить тесты
test_summer_school_2016.exe
. В результате прохождения тестов появится список тестов и их статус.
-
Сделать форк upstream-репозитория.
- Открыть в браузере upstream-репозиторий https://github.com/itseez-academy/itseez-ss-2016-practice.
- В правом верхнем углу нажать кнопку Fork.
- Выбрать в качестве организации, куда направить форк, организацию,
соответствующую вашему аккаунту
@github-account
.
-
Клонировать origin-репозиторий к себе на локальную машину (раздел Общие инструкции по работе с Git).
- Открыть командную строку Git Bash (или Git Shell в зависимости от того, какой git-клиент установлен на вашей машине). Для этого необходимо найти соответствующий ярлык на рабочем столе или в меню "Пуск".
- Воспользоваться перечнем инструкций, описанных в разделе Общие инструкции по работе с Git).
-
Собрать проект и проверить его работоспособность, запустив тесты и пример (раздел Сборка проекта с помощью CMake и MS VS).
- Воспользоваться инструкцией по сборке и запуску, описанной в разделе Сборка проекта с помощью CMake и MS VS).
- Чтобы проверить работоспособность тестов и сэмпла, достаточно запустить
test_summer_school_2016.exe
иtemplate_demo.exe
. Если все тесты "зеленые" и сэмпл отработал, то можно двигаться дальше.
$ cd itseez-ss-2016-practice-build/bin $ test_summer_school_2016.exe $ template_demo.exe
-
Создать рабочую ветку (раздел Общие инструкции по работе с Git).
-
Реализовать метод отсечения элементов двумерного массива типа
unsigned char
. Объявление метода находится в файлеworkaround.hpp
, классMatrixProcessor
, а реализация метода - в файлеworkaround.cpp
. По мере готовности не забывайте выкладывать изменения в рабочую ветку на сервер. -
Разработать тесты для реализованной функции отсечения.
-
Собрать проект и проверить работоспособность разработанного примера использования функции отсечения (раздел Сборка проекта с помощью CMake и MS VS).
-
Сделать Pull Request в upstream-репозиторий.
-
Решить задачи списка Дополнительные задачи.