К настоящему моменту решены все технические вопросы, поэтому в данном разделе сконцентрируемся на модельной задаче определения контуров объекта, а также на рассмотрении базовых функций библиотеки OpenCV для решения данной задачи.
Резкое изменение яркости изображения представляет интерес по нескольким причинам [20]:
Пользуясь терминологией, принятой в компьютерном зрении, точки, в которых происходит резкий перепад яркости изображения, называются краями или краевыми точками. Возникает проблема, связанная с тем, как связать краевые точки с границами или контурами объектов на изображении. Далее попробуем решить данную задачу средствами библиотеки OpenCV. Предварительно рассмотрим ряд базовых функций работы с изображениями.
В OpenCV любое изображение представляет собой матрицу интенсивностей, а именно объект класса Mat. Существует много способов создания объекта данного типа, рассмотрим два наиболее часто используемых в контексте изображений:
// _rows – количество строк // _cols – количество столбцов // _type – тип матрицы (CV_8UC1, CV_64FC3 и другие) Mat(int _rows, int _cols, int _type); Mat(Size _size, int _type); // _s - заполнитель Mat(int _rows, int _cols, int _type, const Scalar& _s); Mat(Size _size, int _type, const Scalar& _s);
void create(int _rows, int _cols, int _type); void create(Size _size, int _type);
По сути это два эквивалентных способа создания, выбор, что использовать, безусловно, принадлежит разработчику.
После выполнения всех операций с объектом типа Mat необходимо освободить память, вызвав метод release.
void release();
Загрузка изображения – это одна из основных операций. Ниже приведен прототип функции OpenCV, которая отвечает за загрузку изображений.
Mat imread(const string& filename, int flags=1)
Как отмечалось в предыдущем разделе, изображение представляет собой двумерную матрицу интенсивностей, поэтому функция imread возвращает объект типа Mat. В качестве входных параметров функция принимает название файла filename и целочисленный флаг flags, определяющий правило загрузки:
Класс Mat имеет набор полей и методов, часть из которых представляет интерес с точки зрения работы с изображением:
Описание назначения других полей и методов можно найти в документации [14].
Естественным образом раз есть операция чтения изображения, необходима и противоположная операция сохранения. Сохранение изображения в файл осуществляется посредством вызова функции imwrite, прототип которой приведен далее.
bool imwrite(const string& filename, const Mat& img, const vector<int>& params=vector<int>())
Функция в качестве параметров принимает название файла filename, в который необходимо сохранить изображение, само изображение img, а также вектор целочисленных параметров params. Указанный вектор определяет параметры сохранения в файл, специфичные для выбранного формата сохранения. Формат определяется расширением файла filename. Вектор параметров представляет собой единую последовательность пар <идентификатор_параметра> и <значение_параметра>. На данный момент доступны следующие идентификаторы: