|
1 |
| -# Инфраструктура для проведения практики по основам библиотеки компьютерного зрения OpenCV |
| 1 | +# Практика 2. Базовые примитивы и основные операции обработки изображений в библиотеке OpenCV |
2 | 2 |
|
3 | 3 | [](https://travis-ci.org/Itseez-NNSU-SummerSchool2015/practice2-opencv-intro)
|
4 | 4 |
|
5 | 5 |
|
6 |
| -Проект представляет собой инфраструктуру для освоения основ работы с библиотекой OpenCV: |
7 |
| - - Загрузка/сохранение изображений (базовые примитивы и операции модуля ```opencv_core```). |
8 |
| - - Обработка изображений с помощью простеших фильтров библиотеки (операции модуля ```opencv_imgproc```). |
9 |
| - - Разработка простейшего интерфейса средствами библиотеки (базовые операции модуля ```opencv_highgui```). |
| 6 | +Проект представляет собой инфраструктуру для освоения основ работы |
| 7 | +с библиотекой OpenCV: |
| 8 | + - Загрузка/сохранение изображений (базовые примитивы и операции |
| 9 | + модуля ```opencv_core```). |
| 10 | + - Обработка изображений с помощью простеших фильтров библиотеки |
| 11 | + (операции модуля ```opencv_imgproc```). |
| 12 | + - Разработка простейшего интерфейса средствами библиотеки (базовые |
| 13 | + операции модуля ```opencv_highgui```). |
10 | 14 |
|
11 | 15 | ## Общая структура проекта
|
12 | 16 |
|
13 | 17 | Структура проекта:
|
14 |
| - - ```3rdparty``` - библиотека gtest. |
15 |
| - - ```include``` - директория для размещения заголовочных файлов. |
16 |
| - - ```samples``` - директория для размещения примеров использования. |
17 |
| - - ```src``` - директория с исходными кодами. |
18 |
| - - ```test``` - директория с тестами. |
19 |
| - - ```.gitignore``` - перечень расширений файлов, которые не выкладываются в проект. |
20 |
| - - ```.travis.yml``` - конфигурационный файл для системы автоматического тестирования Travis-CI. |
21 |
| - - ```CMakeLists.txt``` - общий файл для сборки проекта с помощью CMake. |
22 |
| - - ```README.md``` - информация о проекте, которую вы сейчас читаете. |
| 18 | + - `3rdparty` - библиотека gtest. |
| 19 | + - `include` - директория для размещения заголовочных файлов. |
| 20 | + - `samples` - директория для размещения примеров использования. |
| 21 | + - `src` - директория с исходными кодами. |
| 22 | + - `test` - директория с тестами. |
| 23 | + - `testdata``` - директория с данными для тестов. |
| 24 | + - `.gitignore` - перечень расширений файлов, которые не выкладываются |
| 25 | + в проект. |
| 26 | + - `.travis.yml` - конфигурационный файл для системы автоматического |
| 27 | + тестирования Travis-CI. |
| 28 | + - `CMakeLists.txt` - общий файл для сборки проекта с помощью CMake. |
| 29 | + - `README.md` - информация о проекте, которую вы сейчас читаете. |
23 | 30 |
|
24 | 31 | В шаблонном проекте имеются следующие модули:
|
25 |
| - - Модуль вспомогательных функций (```./include/auxiliaries.hpp```, ```./src/auxiliaries.hpp```), в частности, функция обработки аргументов командной строки. |
26 |
| - - Модуль, содержащий объявление и реализацию функций загрузки, обработки и отображения изображений (```./include/img_proc.hpp```, ```./src/img_proc.hpp```). |
27 |
| - - Примеры тестов (```aux_test.cpp```). |
28 |
| - - Пример приложения, полностью решающего задачу (```sample_template.cpp```). |
| 32 | + - Модуль вспомогательных функций (`./include/auxiliaries.hpp`, |
| 33 | + `./src/auxiliaries.hpp`), в частности, функция обработки аргументов |
| 34 | + командной строки. |
| 35 | + - Модуль, содержащий объявление и реализацию функций загрузки, обработки |
| 36 | + и отображения изображений (`./include/img_proc.hpp`, `./src/img_proc.hpp`). |
| 37 | + - Примеры тестов (`aux_test.cpp`). |
| 38 | + - Пример приложения, демонстрирующего применение медианного фильтра |
| 39 | + (`sample_template.cpp`). |
29 | 40 |
|
30 | 41 | ## Цели и задачи
|
31 | 42 |
|
32 |
| -**_Цель данной работы_** - изучить базовые примитивы модуля ```opencv_core``` и простейшие операции обработки изображений модуля ```opencv_imgproc```, научиться разрабатывать интерфейс средствами модуля ```opencv_highgui``` на примере задачи определения ребер на изображении. |
| 43 | +__Цель данной работы__ - изучить базовые примитивы модуля `opencv_core` |
| 44 | +и простейшие операции обработки изображений модуля `opencv_imgproc`, научиться |
| 45 | +разрабатывать интерфейс средствами модуля `opencv_highgui` на примере задачи |
| 46 | +определения ребер на изображении. |
33 | 47 |
|
34 |
| -Для этого необходимо решить следующие **_задачи_**: |
35 |
| - 1. Изучить базовые методы класса ```Mat``` (модуль ```opencv_core```), который применяется для представления изображений. |
| 48 | +Для этого необходимо решить следующие __задачи__: |
| 49 | + 1. Изучить базовые методы класса `Mat` (модуль `opencv_core`), который |
| 50 | + применяется для представления изображений. |
36 | 51 | 2. Рассмотреть основные операции работы с изображениями:
|
37 |
| - 1. Создание изображения (с помощью конструкторов или метода ```create``` класса ```Mat```). |
38 |
| - 2. Загрузка изображения (функция ```imread```). |
39 |
| - 3. Сохранение изображения (функция ```imwrite```). |
40 |
| - 4. Отображение изображения (функции ```imshow```, ```waitKey```). |
41 |
| - 5. Копирование изображения (метод ```copyTo``` класса ```Mat```). |
| 52 | + 1. Создание изображения (с помощью конструкторов или метода `create` |
| 53 | + класса `Mat`). |
| 54 | + 2. Загрузка изображения (функция `imread`). |
| 55 | + 3. Сохранение изображения (функция `imwrite`). |
| 56 | + 4. Отображение изображения (функции `imshow`, `waitKey`). |
| 57 | + 5. Копирование изображения (метод `copyTo` класса `Mat`). |
42 | 58 | 6. Методы фильтрации (размытие, сглаживание и др.).
|
43 |
| - 7. Преобразование изображения в различные цветовые пространства (функция ```cvtColor```). |
44 |
| - 3. Изучить и реализовать с использованием OpenCV различные способы выделения контуров на изображении: |
45 |
| - 1. Бинаризация изображения (функция ```threshold```) + поиск контуров (функция ```findContours```). Примечание: для отображения контуров следует использовать функцию ```drawContours```. |
46 |
| - 2. Морфологический градиент (функция ```morphologyEx```). |
47 |
| - 3. Оператор Собеля (функция ```Sobel```). |
48 |
| - 4. Оператор Лапласа (функция ```Laplacian```). |
49 |
| - 5. Детектор ребер Канни (функция ```Canny```). Примечание: перед применением фильтра Канни потребуется выполнить фильтрацию и преобразование изображеня в оттенки серого. |
| 59 | + 7. Преобразование изображения в различные цветовые пространства |
| 60 | + (функция `cvtColor`). |
| 61 | + 3. Изучить и реализовать с использованием OpenCV различные способы |
| 62 | + выделения контуров на изображении: |
| 63 | + 1. Бинаризация изображения (функция `threshold`) + поиск контуров |
| 64 | + (функция `findContours`). Примечание: для отображения контуров |
| 65 | + следует использовать функцию `drawContours`. |
| 66 | + 2. Морфологический градиент (функция `morphologyEx`). |
| 67 | + 3. Оператор Собеля (функция `Sobel`). |
| 68 | + 4. Оператор Лапласа (функция `Laplacian`). |
| 69 | + 5. Детектор ребер Канни (функция `Canny`). Примечание: перед применением |
| 70 | + фильтра Канни потребуется выполнить фильтрацию и преобразование |
| 71 | + изображения в оттенки серого. |
50 | 72 | 4. Разработать графический интерфейс, удовлетворяющий следующим требованиям:
|
51 | 73 | 1. Отображение исходного изображения.
|
52 | 74 | 2. Отображение изображения, на котором отображены контуры.
|
53 |
| - 3. Наличие набора переключателей (кнопок) для применения различных методов выделения контуров. |
| 75 | + 3. Наличие набора переключателей (кнопок) для применения различных |
| 76 | + методов выделения контуров. |
54 | 77 |
|
55 | 78 | ## Инструкция по выполнению работы
|
56 | 79 |
|
57 |
| - 1. Создать аккаунт на [github.com](https://github.com), если такой отсутствует. Для определенности обозначим аккаунт ```github-account```. |
| 80 | + 1. Создать аккаунт на [github.com](https://github.com), если такой |
| 81 | + отсутствует. Для определенности обозначим аккаунт `github-account`. |
58 | 82 |
|
59 |
| - 2. Сделать fork репозитория ```https://github.com/Itseez-NNSU-SummerSchool2015/practice2-opencv-intro``` (в терминологии Git upstream-репозиторий) к себе в организацию с названием github-account. В результате будет создана копию репозитория с названием ```https://github.com/github-account/practice2-opencv-intro``` (origin-репозиторий). |
| 83 | + 2. Сделать fork репозитория |
| 84 | + <https://github.com/Itseez-NNSU-SummerSchool2015/practice2-opencv-intro> |
| 85 | + (в терминологии Git upstream-репозиторий) к себе в организацию с названием |
| 86 | + `github-account`. В результате будет создана копию репозитория с названием |
| 87 | + <https://github.com/github-account/practice2-opencv-intro> |
| 88 | + (origin-репозиторий). |
60 | 89 |
|
61 |
| - 3. Клонировать репозиторий ```https://github.com/github-account/practice2-opencv-intro```, воспользовавшись следующей командой: |
| 90 | + 3. Клонировать репозиторий [origin][origin] к себе на локальный компьютер, |
| 91 | + воспользовавшись следующей командой: |
62 | 92 |
|
63 | 93 | ```
|
64 | 94 | $ git clone https://github.com/github-account/practice2-opencv-intro
|
|
70 | 100 | $ git remote add upstream https://github.com/Itseez-NNSU-SummerSchool2015/practice2-opencv-intro
|
71 | 101 | ```
|
72 | 102 |
|
73 |
| - 5. Настроить имя пользователя, из под которого будут выполняться все операции с репозиторией Git: |
| 103 | + 5. Настроить имя пользователя, из под которого будут выполняться |
| 104 | + все операции с репозиторией Git: |
74 | 105 |
|
75 | 106 | ```
|
76 | 107 | $ git config --global user.name "github-account"
|
77 | 108 | ```
|
78 | 109 |
|
79 |
| - 6. Создать ветку find-contours-implementation и перейти в нее: |
| 110 | + 6. Создать ветку `find-contours-implementation` и перейти в нее: |
80 | 111 |
|
81 | 112 | ```
|
82 | 113 | $ git checkout -b find-contours-implementation
|
83 | 114 | ```
|
84 | 115 |
|
85 |
| - 7. В ветку ```find-contours-implementation``` поместить реализации различных методов поиска контуров, снабдив весь разработанный код необходимым набором тестов. |
| 116 | + 7. В ветку `find-contours-implementation` поместить реализации различных |
| 117 | + методов поиска контуров, снабдив весь разработанный код необходимым |
| 118 | + набором тестов. В качестве шаблона необходимо использовать модуль |
| 119 | + `img_proc`. Модуль должен быть расширен различными реализациями методов |
| 120 | + поиска контуров на изображении средствами OpenCV. Для начала имеет смысл |
| 121 | + сосредоточиться на реализации одного метода из перечисленных ниже. |
| 122 | + |
| 123 | + 1. Бинаризация изображения (функция `threshold`) + поиск контуров |
| 124 | + (функция `findContours`). Примечание: для отображения контуров |
| 125 | + следует использовать функцию `drawContours`. |
| 126 | + 2. Морфологический градиент (функция `morphologyEx`). |
| 127 | + 3. Оператор Собеля (функция `Sobel`). |
| 128 | + 4. Оператор Лапласа (функция `Laplacian`). |
| 129 | + 5. Детектор ребер Канни (функция `Canny`). Примечание: перед применением |
| 130 | + фильтра Канни потребуется выполнить фильтрацию и преобразование |
| 131 | + изображения в оттенки серого. |
86 | 132 |
|
87 |
| - 8. Создать ветку gui-implementation и перейти в нее: |
| 133 | + 8. Создать ветку `gui-implementation` и перейти в нее: |
88 | 134 |
|
89 | 135 | ```
|
90 | 136 | $ git checkout -b gui-implementation
|
91 | 137 | ```
|
92 | 138 |
|
93 |
| - 9. В ветку ```gui-implementation``` поместить разработанную интерфейсную часть. Примечание: по существу необходимо разработать пример использования библиотеки поиска контуров. |
94 |
| - |
95 |
| - 10. После получения каждой стабильной версии не забывайте проверять работоспособность тестов и выкладывать изменения в ветку. |
| 139 | + 9. В ветку `gui-implementation` поместить разработанную интерфейсную часть. |
| 140 | + Примечание: по существу необходимо разработать пример использования |
| 141 | + реализованного метода поиска контуров. Далее приведены возможные |
| 142 | + варианты реализации интерфейса в порядке их усложнения с точки зрения |
| 143 | + программной реализации. |
| 144 | + |
| 145 | + 1. Отобразите одновременно в одном окне исходное изображение и изображение |
| 146 | + с выделенными контурами. |
| 147 | + |
| 148 | + *Указание:* воспользуйтесь имеющимся примером отображения результата |
| 149 | + медианной фильтрации. |
| 150 | + |
| 151 | + 2. Добавьте внизу окна виртуальные кнопки (на самом деле одноцветные |
| 152 | + изображения), каждая из которых соответствует вызову определенного |
| 153 | + метода выделения контуров изображении. Не забудьте на них добавить |
| 154 | + соответствующие надписи. Обеспечьте возможность обновления результата |
| 155 | + выделения контуров при нажатии на каждую из кнопок. |
| 156 | + |
| 157 | + *Указание:* следует использовать возможность создания обработчика |
| 158 | + события нажатия на кнопку, отслеживая положение курсора в каждый |
| 159 | + текущий момент времени, чтобы определить, какой метод поиска контуров |
| 160 | + необходимо вызвать. |
| 161 | + |
| 162 | + **Примечание:** примеров использования библиотеки может быть в проекте много. |
| 163 | + Когда разработан какой-то метод стоит его снабдить простым примером |
| 164 | + использования. Если задача выделения контуров решена уже несколькими |
| 165 | + способами, то можно подумать над усложненными вариантом интерфеса, который |
| 166 | + объединяет возможности использования различных способов выделения контуров. |
| 167 | + |
| 168 | + 10. После получения каждой стабильной версии не забывайте проверять |
| 169 | + работоспособность тестов и выкладывать изменения в ветку. |
96 | 170 |
|
97 | 171 | ```
|
| 172 | + $ git status # Получить список текущих изменений |
| 173 | + |
| 174 | + $ git add [<file_name>] # Добавить файл в репозиторий |
| 175 | + # <file_name> - название файла для добавления в commit |
| 176 | + если вместо имени указан символ *, то будут добавлены все новые файлы, |
| 177 | + расширение которых не указано в .gitignore |
| 178 | + |
98 | 179 | $ git commit [-m "<message_to_commit>"] [-a]
|
99 |
| - [-a] - автоматически добавляет изменения для существующих на сервере файлов без выполнения команды git add |
100 |
| - [--amend] - перезаписывает последний коммит (используется, если не забыты изменения) |
101 |
| - ``` |
| 180 | + # [-a] - автоматически добавляет изменения для существующих на сервере файлов |
| 181 | + без выполнения команды git add |
| 182 | + # [--amend] - перезаписывает последний коммит (используется, если не забыты |
| 183 | + изменения) |
102 | 184 |
|
| 185 | + $ git push origin find-contours-implementation # или gui-implementation |
103 | 186 | ```
|
104 |
| - git push origin <branch-name> |
105 |
| - ``` |
106 | 187 |
|
107 |
| - 11. Не забудьте сделать Pull Request, чтобы проверить работоспособность тестов на Travis-CI и позволить преподавателям сделать ревью Вашего кода. |
| 188 | + 11. Не забудьте сделать Pull Request, чтобы проверить работоспособность |
| 189 | + тестов на Travis-CI и позволить преподавателям сделать ревью Вашего кода. |
| 190 | + |
| 191 | + **Примечание:** подробная инструкция по сборке проекта, запуска тестов была |
| 192 | + описана в [практической работе по освоению инструментов разработки] |
| 193 | + (https://github.com/Itseez-NNSU-SummerSchool2015/practice1-devtools). |
| 194 | + При сборке проекта в командной строке `cmake` необходимо указать |
| 195 | + опцию `-DOpenCV_DIR="path-to-OpenCVConfig.cmake"`, чтобы подключить |
| 196 | + библиотеку OpenCV. |
108 | 197 |
|
109 |
| - **Примечание:** подробная инструкция по сборке проекта, запуска тестов была описана |
110 |
| - в [практической работе по освоению инструментов разработки](https://github.com/Itseez-NNSU-SummerSchool2015/practice1-devtools). |
111 |
| - При сборке проекта в командной строке `cmake` необходимо указать опцию `-DOpenCV_DIR="path-to-OpenCVConfig.cmake"` |
| 198 | + 12. При наличии времени можно организовать обработку видео и вместо одного |
| 199 | + изображения обрабатывать и отображать последовательно идущие кадры |
| 200 | + потока. |
| 201 | + |
| 202 | +<!-- LINKS --> |
| 203 | + |
| 204 | +[origin]: https://github.com/github-account/practice2-opencv-intro |
0 commit comments