Skip to content

Commit f9c8579

Browse files
author
Kirill Kornyakov
committed
Merge pull request #3 from valentina-kustikova/master
Median filter sample.
2 parents 491e9f5 + 201a742 commit f9c8579

File tree

12 files changed

+254
-88
lines changed

12 files changed

+254
-88
lines changed

CMakeLists.txt

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
33
set(PROJECT_NAME practice2)
44
project(${PROJECT_NAME})
55

6-
option(WITH_CODE_COVERAGE "Enable code coverage analysis" OFF)
7-
86
set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Configs" FORCE)
97
if(NOT CMAKE_BUILD_TYPE)
108
set(CMAKE_BUILD_TYPE Release)
@@ -17,24 +15,14 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEAS
1715

1816
set(PRACTICE2_LIBRARY ${PROJECT_NAME})
1917
set(PRACTICE2_TESTS "${PROJECT_NAME}_test")
20-
21-
find_package(OpenCV REQUIRED)
22-
2318
set(PRACTICE2_INCLUDE "${CMAKE_CURRENT_SOURCE_DIR}/include")
19+
2420
include_directories("${PRACTICE2_INCLUDE}")
2521
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/3rdparty")
2622

23+
find_package(OpenCV REQUIRED)
2724
set(LIBRARY_DEPS ${OpenCV_LIBS})
2825

29-
if (WITH_CODE_COVERAGE)
30-
if (CMAKE_COMPILER_IS_GNUCXX)
31-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
32-
else()
33-
message(WARNING "Code coverage can be estimated only when g++ compiler is used. Code coverage analysis is disabled.")
34-
set(WITH_CODE_COVERAGE OFF)
35-
endif()
36-
endif()
37-
3826
# BUILD
3927
add_subdirectory(3rdparty)
4028
add_subdirectory(src)
@@ -48,5 +36,4 @@ message( STATUS "======================================")
4836
message( STATUS "")
4937
message( STATUS " Configuration: ${CMAKE_BUILD_TYPE}")
5038
message( STATUS " OpenCV build path: ${OpenCV_DIR}")
51-
message( STATUS " Enable code coverage: ${WITH_CODE_COVERAGE}")
5239
message( STATUS "")

README.md

Lines changed: 146 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,94 @@
1-
# Инфраструктура для проведения практики по основам библиотеки компьютерного зрения OpenCV
1+
# Практика 2. Базовые примитивы и основные операции обработки изображений в библиотеке OpenCV
22

33
[![Build Status](https://travis-ci.org/Itseez-NNSU-SummerSchool2015/practice2-opencv-intro.svg)](https://travis-ci.org/Itseez-NNSU-SummerSchool2015/practice2-opencv-intro)
44

55

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```).
1014

1115
## Общая структура проекта
1216

1317
Структура проекта:
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` - информация о проекте, которую вы сейчас читаете.
2330

2431
В шаблонном проекте имеются следующие модули:
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`).
2940

3041
## Цели и задачи
3142

32-
**_Цель данной работы_** - изучить базовые примитивы модуля ```opencv_core``` и простейшие операции обработки изображений модуля ```opencv_imgproc```, научиться разрабатывать интерфейс средствами модуля ```opencv_highgui``` на примере задачи определения ребер на изображении.
43+
__Цель данной работы__ - изучить базовые примитивы модуля `opencv_core`
44+
и простейшие операции обработки изображений модуля `opencv_imgproc`, научиться
45+
разрабатывать интерфейс средствами модуля `opencv_highgui` на примере задачи
46+
определения ребер на изображении.
3347

34-
Для этого необходимо решить следующие **_задачи_**:
35-
1. Изучить базовые методы класса ```Mat``` (модуль ```opencv_core```), который применяется для представления изображений.
48+
Для этого необходимо решить следующие __задачи__:
49+
1. Изучить базовые методы класса `Mat` (модуль `opencv_core`), который
50+
применяется для представления изображений.
3651
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`).
4258
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+
изображения в оттенки серого.
5072
4. Разработать графический интерфейс, удовлетворяющий следующим требованиям:
5173
1. Отображение исходного изображения.
5274
2. Отображение изображения, на котором отображены контуры.
53-
3. Наличие набора переключателей (кнопок) для применения различных методов выделения контуров.
75+
3. Наличие набора переключателей (кнопок) для применения различных
76+
методов выделения контуров.
5477

5578
## Инструкция по выполнению работы
5679

57-
1. Создать аккаунт на [github.com](https://github.com), если такой отсутствует. Для определенности обозначим аккаунт ```github-account```.
80+
1. Создать аккаунт на [github.com](https://github.com), если такой
81+
отсутствует. Для определенности обозначим аккаунт `github-account`.
5882

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-репозиторий).
6089

61-
3. Клонировать репозиторий ```https://github.com/github-account/practice2-opencv-intro```, воспользовавшись следующей командой:
90+
3. Клонировать репозиторий [origin][origin] к себе на локальный компьютер,
91+
воспользовавшись следующей командой:
6292

6393
```
6494
$ git clone https://github.com/github-account/practice2-opencv-intro
@@ -70,42 +100,105 @@
70100
$ git remote add upstream https://github.com/Itseez-NNSU-SummerSchool2015/practice2-opencv-intro
71101
```
72102

73-
5. Настроить имя пользователя, из под которого будут выполняться все операции с репозиторией Git:
103+
5. Настроить имя пользователя, из под которого будут выполняться
104+
все операции с репозиторией Git:
74105

75106
```
76107
$ git config --global user.name "github-account"
77108
```
78109

79-
6. Создать ветку find-contours-implementation и перейти в нее:
110+
6. Создать ветку `find-contours-implementation` и перейти в нее:
80111

81112
```
82113
$ git checkout -b find-contours-implementation
83114
```
84115

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+
изображения в оттенки серого.
86132

87-
8. Создать ветку gui-implementation и перейти в нее:
133+
8. Создать ветку `gui-implementation` и перейти в нее:
88134

89135
```
90136
$ git checkout -b gui-implementation
91137
```
92138

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+
работоспособность тестов и выкладывать изменения в ветку.
96170

97171
```
172+
$ git status # Получить список текущих изменений
173+
174+
$ git add [<file_name>] # Добавить файл в репозиторий
175+
# <file_name> - название файла для добавления в commit
176+
если вместо имени указан символ *, то будут добавлены все новые файлы,
177+
расширение которых не указано в .gitignore
178+
98179
$ git commit [-m "<message_to_commit>"] [-a]
99-
[-a] - автоматически добавляет изменения для существующих на сервере файлов без выполнения команды git add
100-
[--amend] - перезаписывает последний коммит (используется, если не забыты изменения)
101-
```
180+
# [-a] - автоматически добавляет изменения для существующих на сервере файлов
181+
без выполнения команды git add
182+
# [--amend] - перезаписывает последний коммит (используется, если не забыты
183+
изменения)
102184
185+
$ git push origin find-contours-implementation # или gui-implementation
103186
```
104-
git push origin <branch-name>
105-
```
106187

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.
108197

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

include/auxiliaries.hpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
11
#pragma once
22

3-
int parseArguments(int argc, char **argv);
3+
#include <string>
4+
5+
struct Parameters
6+
{
7+
std::string imgFileName;
8+
};
9+
10+
int parseArguments(int argc, char **argv, Parameters &params);

include/img_proc.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66

77
using namespace cv;
88

9-
int getFrame(Mat& src);
9+
int getFrame(const std::string &fileName, Mat& src);
1010

1111
int processFrame(const Mat& src, Mat& dst);
1212

13-
int show(const Mat& src, const Mat& dst);
13+
int show(const std::string &caption, const Mat& src, const Mat& dst);

samples/sample_template.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,30 @@ using namespace cv;
99

1010
int main(int argc, char **argv)
1111
{
12-
if (parseArguments(argc, argv) != 0)
12+
const std::string caption = "Median filter";
13+
Parameters params;
14+
if (parseArguments(argc, argv, params) != 0)
1315
{
14-
cout << "Incorrect input parameters!" << endl;
16+
cout << "practice2 <img_name>" << endl;
17+
cout << "<img_name> - image name for filtering" << endl;
1518
return 1;
1619
}
1720

1821
Mat src, dst;
1922

20-
if (getFrame(src) != 0)
23+
if (getFrame(params.imgFileName, src) != 0)
2124
{
2225
cout << "Error: \'src\' image is null or empty!" << endl;
2326
return 2;
2427
}
2528

26-
processFrame(src, dst);
29+
if (processFrame(src, dst) != 0)
30+
{
31+
cout << "Error: Filtering failed!" << endl;
32+
return 3;
33+
}
2734

28-
show(src, dst);
35+
show(caption, src, dst);
2936

3037
return 0;
3138
}

src/auxiliaries.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
#include "auxiliaries.hpp"
22

3-
int parseArguments(int argc, char **argv)
3+
int parseArguments(int argc, char **argv, Parameters &params)
44
{
5+
if (argc < 2)
6+
{
7+
return 1;
8+
}
9+
params.imgFileName = std::string(argv[1]);
510
return 0;
611
}

0 commit comments

Comments
 (0)