При прохождении теста 1 в нем оказались вопросы, который во-первых в 1 лекции не рассматривались, во-вторых, оказалось, что вопрос был рассмаотрен в самостоятельно работе №2. Это значит, что их нужно выполнить перед прохождением теста? или это ошибка? |
Сборка и установка библиотеки OpenCV. Использование библиотеки в среде Microsoft Visual Studio
4.2.4. Отображение изображения
Безусловно, после обработки изображения необходимо посмотреть результат. Для корректного отображения изображения необходимо последовательно выполнить три действия:
-
Создать окно для отображения с помощью функции namedWindow. Функция принимает на вход название окна, которое служит идентификатором окна, и флаги. Отметим, что если окно с аналогичным идентификатором уже существует, то функция не выполняет никаких действий.
void namedWindow(const string& winname, int flags)
Параметр flags может принимать следующие значения или их комбинации, полученные в результате применения оператора "OR":
- CV_WINDOW_NORMAL или CV_WINDOW_AUTOSIZE, первое значение позволяет пользователю вручную изменять размеры окна в процессе работы приложения, в то время, как второе автоматически подгоняет размеры окна под размеры изображения, запрещая пользователю изменять размер вручную;
- CV_WINDOW_FREERATIO или CV_WINDOW_KEEPRATIO, CV_WINDOW_FREERATIO подгоняет изображение под окно без сохранения пропорций, CV_WINDOW_KEEPRATIO позволяет сохранять пропорции;
- CV_GUI_NORMAL или CV_GUI_EXPANDED, первое значение обеспечивает отрисовку окна без дополнительных компонент таких, например, как строка состояний и панель инструментов, второе же, напротив, предоставляет более новые возможности по созданию графических интерфейсов пользователя наряду с отображением изображений.
По умолчанию для окна устанавливаются свойства CV_WINDOW_AUTOSIZE, CV_WINDOW_KEEPRATIO, и CV_GUI_EXPANDED.
- Отобразить изображение посредством вызова функции imshow. Для отображения необходим идентификатор окна winname, в которое будет помещено изображение, а также само изображение image.
void imshow(const string& winname, const Mat& image)
- Дождаться нажатия какой-либо клавиши, чтобы закрыть окно. Ожидание реализуется посредством вызова функции waitKey, которая принимает на вход время ожидания delay в миллисекундах. По умолчанию delay=0, что означает ожидание в течение бесконечного промежутка времени, т.е. исполнение приложения будет продолжено после нажатия какой-либо клавиши. Отметим, что отсутствие вызова указанной функции приведет к тому, что по завершении программы окно будет автоматически закрыто.
int waitKey(int delay=0)
4.2.5. Копирование изображения
В некоторых случаях при разработке приложений необходимо работать не с самим изображением, а с его полной копией, чтобы повторно использовать исходное изображение. Напомним, что изображение представляется объектом класса Mat. В состав методов данного класса входит метод clone, который решает указанную задачу.
Mat clone() const;
Есть еще пара полезных методов копирования copyTo: первый (см. прототип ниже) выделяет память для хранения полностью аналогичной матрицы m и копирует в нее содержимое текущей матрицы, второй метод выполняет копирование в соответствии с передаваемой маской mask (копируются только элементы, которым соответствуют ненулевые элементы маски).
void copyTo(Mat& m) const; void copyTo(Mat& m, const Mat& mask) const;
4.2.6. Конвертирование изображения в другое цветовое пространство
Конвертирование изображения из одного цветового пространства в другое – это еще одна достаточно важная операция, т.к., например, многие алгоритмы компьютерного зрения работают на изображениях в оттенках серого, в то время как исходное изображение с камеры цветное. Функция cvtColor позволяет конвертировать изображение в другое цветовое пространство.
void cvtColor(const Mat& src, Mat& dst, int code, int dstCn=0)
Входными параметрами данной функции являются исходное изображение src, которое необходимо конвертировать в другое цветовое пространство, конвертированное изображение dst, код операции конвертирования code (из какого в какое пространство) и количество каналов в результирующем изображении dstCn. По умолчанию параметр dstCn принимает значение 0, это означает, что количество каналов результирующего изображения будет определено автоматически. Отметим, что в случае, когда исходное изображение цветное, явно указывается порядок сохранения каналов (RGB или BGR). Рассмотрим подробнее возможные значения, которые принимает параметр code [15]:
- CV_RGB2GRAY, CV_GRAY2RGB – конвертирование из RGB-пространства в оттенки серого (значение интенсивности вычисляется как взвешенная линейная свертка интенсивностей по всем трем каналам) и наоборот (дублирование интенсивности по трем каналам);
- CV_BGR2XYZ, CV_RGB2XYZ, CV_XYZ2BGR, CV_XYZ2RGB – преобразование из RGB/BGR-пространств в линейное трехкомпонентное пространство CIE XYZ, основанное на результатах измерения характеристик человеческого глаза, и обратно;
- CV_BGR2YCrCb, CV_RGB2YCrCb – конвертирование изображения из BGR/RGB в пространство (первый канал – линейная комбинация интенсивностей по трем каналам исходного изображения, второй/третий – функции разностей интенсивностей красного/синего и полученного значения интенсивности первого канала), CV_YCrCb2BGR, CV_YCrCb2RGB – обратное конвертирование;
- CV_BGR2HSV, CV_RGB2HSV, CV_HSV2BGR, CV_HSV2RGB – коды операций преобразования из RGB/BGR пространств в HSV и наоборот;
- CV_BGR2HLS, CV_RGB2HLS, CV_HLS2BGR, CV_HLS2RGB – коды операций конвертирования из RGB/BGR-пространств в HLS и наоборот;
- CV_BGR2Lab, CV_RGB2Lab, CV_Lab2BGR, CV_Lab2RGB – коды, обеспечивающие преобразование из BGR/RGB-пространств в CIE L*a*b* и обратно;
- CV_BGR2Luv, CV_RGB2Luv, CV_Luv2BGR, CV_Luv2RGB – коды, обеспечивающие преобразование из BGR/RGB пространства в CIE L*u*v* и обратно;
- CV_BayerBG2BGR, CV_BayerGB2BGR, CV_BayerRG2BGR, CV_BayerGR2BGR, CV_BayerBG2RGB, CV_BayerGB2RGB, CV_BayerRG2RGB, V_BayerGR2RGB. Шаблон Байера (Bayer pattern) – это широко используемый формат хранения изображений в CCD и CMOS камерах. Интенсивности по всем каналам хранятся в одной плоскости, конвертирование в RGB/BGR пространство выполняется посредством интерполяции значений интенсивностей пикселей, принадлежащих некоторой окрестности и содержащих интенсивность соответствующего канала.
4.2.7. Масштабирование изображения
В данном разделе рассматривается операция масштабирования изображения, которая часто используется в алгоритмах, где требуется построить пирамиду, составленную из разных масштабов одного и того же изображения. Ниже представлен прототип соответствующей функции библиотеки OpenCV.
void resize(const Mat& src, Mat& dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR)
Функция resize в качестве входных параметров принимает исходное изображение src, матрицу dst, куда будет записан результат масштабирования, размер dsize результирующего изображения, масштабирующие коэффициенты fx и fy по горизонтали и вертикали соответственно и идентификатор метода интерполяции. Если dsize=0, тогда fx и fy должны быть ненулевыми, и dsize вычисляется по формуле dsize = Size(round(fx*src.cols), round(fy*src.rows))
Если хотя бы один из масштабирующих коэффициентов принимает нулевое значение, тогда его значение определяется в соответствии с одной из формул в зависимости от направления масштабирования (горизонталь или вертикаль): fx=(double)dsize.width/src.cols, fy=(double)dsize.height/src.rows.
Разработчики библиотеки поддерживают следующие методы интерполяции:
- INTER_NEAREST – интерполяция по методу ближайшего соседа;
- INTER_LINEAR – билинейная интерполяция (используется по умолчанию);
- INTER_AREA – интерполяция посредством использования отношения пикселей в некоторой области. Приближение изображения показывает, что результат данной интерполяции очень похож на INTER_NEAREST;
- INTER_CUBIC – бикубическая интерполяция с использованием окрестности 4x4 пикселя;
- INTER_LANCZOS4 – интерполяция Ланшоца (Lanczos) с окрестностью 8x8 пикселей.
4.2.8. Выделение подобласти изображения
Существует значительный класс алгоритмов, которые работают не на всем изображении, а только на некоторой его подобласти – области интереса (region of interests). Поэтому на данном этапе рассмотрим функции для выделения такой подобласти. По существу это операция выделения подматрицы в матрице Mat. Класс Mat имеет два перегруженных оператора круглые скобки, которые и позволяют получить подобласть изображения.
Mat operator()( Range rowRange, Range colRange ) const; Mat operator()( const Rect& roi ) const;
Разница между указанными методами лишь в том, что в первом случае на вход отдаются интервалы изменения индексов по горизонтали rowRange и по вертикали colRange, а во втором – прямоугольник roi, который необходимо выделить из изображения.