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