Skip to content

Latest commit

 

History

History
381 lines (287 loc) · 25.2 KB

README_1.md

File metadata and controls

381 lines (287 loc) · 25.2 KB

Практика 1. Инструменты разработки ПО и знакомство с OpenCV

Цели

Цель данной работы - освоить следующие инструменты разработки программного обеспечения:

  • Утилита CMake для сборки исходных кодов.
  • Система контроля версий Git.
  • Библиотека OpenCV.

Задачи

Основные задачи

  1. Создать серверную копию рабочего репозитория, содержащего практические задания школы.

  2. Создать локальную копию (на рабочей машине) репозитория, содержащего практические задания школы.

  3. Настроить локальную копию репозитория для последующей синхронизации с сервером.

  4. Разработать:

    1. приложение для открытия исходного изображения из файла и сохранения результирующего изображения в файл;
    2. фильтр для перевода изображения в оттенки серого;
    3. фильтр для изменения размера изображения.
  5. Сделать "commit"(зафиксировать) разработанные методы в локальном репозитории.

  6. Отправить "pull request" в основной репозиторий, содержащий шаблоны практических заданий школы.

Дополнительные задачи

  1. Разработать приложение для открытия изображение/видео/видеопотока с веб-камеры и вывода данных на экран.
  2. Разработать фильтр для случайного перемешивания частей картинки (см. игру "пятнашки").
  3. Реализовать фильтр для удаления шума методом Гаусса.

Общая последовательность действий

  1. Сделать форк upstream-репозитория.
  2. Клонировать origin-репозиторий к себе на локальную машину (раздел Общие инструкции по работе с Git).
  3. Собрать проект и проверить его работоспособность, запустив пример (раздел Сборка проекта с помощью CMake и MS VS).
  4. Создать рабочую ветку (раздел Общие инструкции по работе с Git).
  5. Реализовать отображение картинки на экране при помощи OpenCV. По мере готовности не забывайте выкладывать изменения в рабочую ветку на сервер.
  6. Реализовать фильтр, который будет переводить изображение в оттенки серого.
  7. Реализовать фильтр, который будет изменять размер изображения.
  8. Сделать Pull Request в upstream-репозиторий.
  9. Решить задачи списка Дополнительные задачи.

Детальная инструкция по выполнению работы

  1. Сделать форк upstream-репозитория.

    1. Открыть в браузере upstream-репозиторий https://github.com/itlab-vision/CV-SUMMER-CAMP.
    2. В правом верхнем углу нажать кнопку Fork.
    3. Выбрать в качестве организации, куда направить форк, организацию, соответствующую вашему аккаунту @github-account.
  2. Клонировать origin-репозиторий к себе на локальную машину (раздел Общие инструкции по работе с Git).

    1. Открыть командную строку Git Bash (или Git Shell в зависимости от того, какой git-клиент установлен на вашей машине). Для этого необходимо найти соответствующий ярлык на рабочем столе или в меню "Пуск".
    2. Воспользоваться перечнем инструкций, описанных в разделе Общие инструкции по работе с Git).
  3. Собрать проект и проверить его работоспособность, запустив проект practice1. (раздел Сборка проекта с помощью CMake и MS VS).

      - Воспользоваться инструкцией по сборке и запуску, описанной в разделе [Сборка проекта с помощью CMake и MS VS][cmake-msvs]).
      
      - Запустить проект practice1 и удостовериться, что он успешно отработал.
    
      ```bash
      $ cd CV-SUMMER-CAMP-build/bin
      $ practice1.exe
      ```
    
  4. Создать рабочую ветку (раздел Общие инструкции по работе с Git).

  5. Релизовать фильтры:

    1. В файле filter.h объявить класс GrayFilter, наследника класса Filter;
    2. в файле filter.cpp реализовать методы класса GrayFilter.
    3. Важно! Реализовать метод ProcessImage, который возвращает изображение в оттенках серого. Подсказка: используйте фукнцию cvtColor.
    4. В файлеfilter.h обьявить класс ResizeFilter, наследника класса Filter;
    5. в файле filter.cpp реализовать методы класса ResizeFilter.
    6. Важно! реализовать конструктор, принимающий два параметра - новую ширину и высоту изображения;
    7. Важно! реализовать метод ProcessImage, который делает "ресайзинг" исходного изображения и возвращает результат. Подсказка: используйте функцию cvResize.
  6. Создать копию файла <project_source>/samples/practice1.cpp и назвать ее <project_source>/samples/practice1_YOUR_NAME.cpp.

  7. В файле practice1_YOUR_NAME.cpp реализовать чтение файла изображения при помощи имени файла, полученного из аргументов командной строки, и вывести это изображение на экран.

  8. Убедиться, что проект успешно собирается и создается новый исполняемый файл <project_build>/bin/practice1_YOUR_NAME.exe.

  9. В файле practice1_YOUR_NAME.cpp создать объект класса GrayFilter, применить метод ProcessImage к изображению, результат вывести на экран.

  10. В файле practice1_YOUR_NAME.cpp создать объект класса ResizeFilter, применить метод ProcessImage к изображению, результат вывести на экран. Размеры изображения передаются аргументы командной строки.

  11. Прислать Pull Request с внесенными изменениями. Пометить в конце названия (NOT READY). По мере готовности решений основных задач Pull Request можно будет переименовать.

  12. Решить задачи списка Дополнительные задачи.

Общие инструкции по работе с Git

В данном разделе описана типичная последовательность действий, которую необходимо выполнить перед тем, как начать работать с проектом. Далее для определенности используется репозиторий CV-SUMMER-CAMP.

  1. Создать аккаунт на github.com, если такой отсутствует. Для определенности обозначим аккаунт github-account.

  2. Сделать fork репозитория https://github.com/itlab-vision/CV-SUMMER-CAMP (в терминологии Git upstream-репозиторий) к себе в личный профиль с названием github-account. В результате будет создана копия репозитория https://github.com/github-account/CV-SUMMER-CAMP (origin-репозиторий).

  3. Клонировать origin репозиторий к себе на локальный компьютер, воспользовавшись следующей командой:

    $ git clone https://github.com/   <github-account>   /CV-SUMMER-CAMP
  4. Перейти в директорию CV-SUMMER-CAMP:

    $ cd ./CV-SUMMER-CAMP
  5. Настроить адрес upstream-репозитория (потребуется при обновлении локальной версии репозитория):

    $ git remote add upstream https://github.com/itlab-vision/CV-SUMMER-CAMP
  6. Настроить имя пользователя и e-mail, из под которого будут выполняться все операции с репозиторием Git:

    $ git config --local user.name "github-account"
    $ git config --local user.email "github-email"

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

  7. Настроить редактор, который будет использован, если вносятся изменения в историю репозитория (в частности, при слиянии веток).

    $ git config --local core.editor "'C:/Program Files (x86)/Notepad++/notepad++.exe' -n -w"

    Когда сделан форк репозитория у вас создается по умолчанию единственная ветка master. Тем не менее, при решении независимых задач следует создавать рабочие ветки. Далее показаны основные команды для управления ветками на примере ветки practice-1.

  8. Получить список веток:

    $ git branch [-v]
    # [-v] - список с информацией о последних коммитах
  9. Создать ветку:

    $ git branch practice-1
  10. Создать ветку practice-1 и перейти в нее:

    $ git checkout [-b] practice-1
    # [-b] - создание и переход в ветку <branch_name>
  11. Удалить ветку в локальном репозитории:

    $ git branch -d <branch_name>
  12. Удалить ветку на сервере:

    $ git push [remotename] :[branch]
    # [remotename] - имя удалённого репозитория. Если следовать приведённой
    #     инструкции, то origin - репозиторий пользователя github-account, upstream -
    #     репозиторий itlab-vision/CV-SUMMER-CAMP

При работе с файлами в ветке необходимо управлять изменениями. Далее приведен перечень основных команд в предположении, что текущей рабочей веткой является practice-1.

  1. Получить список текущих изменений:

    $ git status
  2. Пометить файл как добавленный в текущую ветку репозитория (файл будет добавлен после выполнения команды commit):

    $ git add [<file_name>]
    # <file_name> - название файла для добавления в commit
    #     если вместо имени указан символ *, то будут добавлены все новые файлы,
    #     не совпадающие с масками, указанными в .gitignore
  3. Добавить изменения в текущую ветку локального репозитория:

    $ git commit [-m "<message_to_commit>"] [-a]
    # [-a] - автоматически добавляет изменения для существующих на сервере файлов
    #     без выполнения команды git add
    # [--amend] - перезаписывает последний коммит (используется, если не забыты
    #     изменения)
  4. Разместить изменения, которые были добавлены в локальный репозиторий с помощью команды commit:

    $ git push [-u] origin [practice-1]
    # [-u] - отслеживать версию ветки [practice-1] на удалённом сервере
    #     (origin). Позволяет получать изменения с сервера при помощи команды git pull
    #     без явного указания имени удалённого репозитория и имени ветки.
  5. Получить изменения с сервера при помощи команды pull и слить их с отслеживаемыми ветками:

    $ git pull [remotename [<branch name>]]
  6. Удалить файлы или директории (!без опции -f для файлов, состояния которых совпадают с состояниям на сервере):

    $ git rm [-f] [--cached]
    # [-f] - принудительное удаление (файла с измененным состоянием)
    # [--cached] - удаление файлов на сервере, но не в локальной директории
  7. Переименовать файлы (или 3 команды: mv, git rm, git add):

    $ git mv <file_from> <file_to>

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

  1. Слияние (вариант 1):

    $ git merge upstream/master # слияние изменений из ветки upstream в master
    $ git merge master # слияние изменений из ветки master в текущую ветку
  2. Слияние (вариант 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>
  3. Инструмент для разрешения конфликтов:

    $ git mergetool

Сборка проекта с помощью CMake и Microsoft Visual Studio 2015

В данном разделе описана типичная последовательность действий, которую необходимо выполнить для сборки проекта с использованием утилиты CMake и Microsoft Visual Studio 2015 или Microsoft Visual Studio 2017. Далее для определенности выполняется сборка проекта из репозитория CV-SUMMER-CAMP.

  1. Рядом с директорией CV-SUMMER-CAMP создайте CV-SUMMER-CAMP-build. В новой директории будут размещены файлы решения и проектов, сгенерированные с помощью CMake.

    $ cd ..
    $ mkdir CV-SUMMER-CAMP-build
  2. Перейдите в директорию CV-SUMMER-CAMP-build:

    $ cd ./CV-SUMMER-CAMP-build
  3. Сгенерируйте файлы решения и проектов с помощью утилиты 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

  1. Нажмите правой кнопкой мыши по проекту ALL_BUILD и выберите пункт Rebuild контекстного меню, чтобы собрать решение. В результате все бинарные файлы будут размещены в директории CV-SUMMER-CAMP-build/bin.
  2. Для запуска приложения и тестов откройте командную строку (cmd.exe в Пуск) и перейдите в директорию с бинарными файлами, используя команду cd.
  3. Можно запустить шаблонное приложение 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.

Запуск приложений

Во время прохождения школы вы будете создавать приложения, в которых некоторые переменные, например пути к файлам, не зашиты во время компиляции, а передаются при помощи параметров запуска. Здесь можно поступать двумя способами.

  1. Запуск с параметрами из командной строки. В проводнике необходимо открыть папку, в которой находится собранное вами приложение, и в строке путь набрать команду cmd. Откроется командная строка, в которой нужно набрать полное имя приложения, далле идут имена параметров и через знак = значения параметров, например:

    $ sample.exe -i="../../СV-SUMMER-CAMP/data/unn_neuromobile.jpg"
  2. Запуск с параметрами из Visual Studio. В этом случае необходимо открыть свойства проекта, выбрать правильную конфигурацию проекта (Debug, Release), далее в свойствах выбрать раздел меню Debugging, и в элементе Debugging Arguments внести ваши параметры.

    input parameters

Добавление аргументов командной строки в приложение

Список параметров для приложения задается в строке строке 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      }";
    ```

Структура исходного кода

  1. В папке src расположен файл filter.h, который содержит объявление абстрактного класса Filter, а также файл filter.сpp, в котором будут храниться реализации методов классов-наследников. ProcessImage - виртуальный метод для фильтрации изображения.
  2. В папке samples расположен файл practice1.cpp, в котором представлена функция main - точка входа в программу.