Опубликован: 02.09.2013 | Доступ: свободный | Студентов: 431 / 54 | Длительность: 19:27:00

Самостоятельная работа 1: Сборка и установка библиотеки OpenCV. Использование библиотеки в среде Microsoft Visual Studio

< Лекция 7 || Самостоятельная работа 1: 1234567891011 || Самостоятельная работа 2 >
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 в пространство YCrCb (первый канал – линейная комбинация интенсивностей по трем каналам исходного изображения, второй/третий – функции разностей интенсивностей красного/синего и полученного значения интенсивности первого канала), 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, CV_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, который необходимо выделить из изображения.

4.2.9. Бинаризация изображения

Остановимся на рассмотрении функции отсечения и бинаризации изображения. Операция отсечения предполагает, что имеется изображение в оттенках серого. В случае бинаризации на выходе формируется черно- белое изображение согласно правилу: если в текущем пикселе исходного изображения интенсивность меньше некоторого порога, то в результирующем изображении данный пиксель имеет черный цвет, в противном случае, белый или наоборот. Операция отсечения является более общей и на выходе может формироваться изображение в оттенках серого, но в основе по-прежнему лежит принцип сравнения с заданным пороговым значением интенсивности.

Функция threshold реализует указанную операцию отсечения для изображения src по порогу thresh и записывает результат в матрицу dst.

double threshold(const Mat& src, Mat& dst, double thresh,  
                 double maxVal, int thresholdType) 
                     

Рассмотрим возможные значения параметра thresholdType, который определяет правило отсечения:

  • THRESH_BINARY, вычисление интенсивности пикселя с координатами (x,y) осуществляется согласно формуле (по существу реализует операцию бинаризации): dst(x,y)=\begin{cases}
maxVal,&\text{если $src(x,y)>thresh$}\\
0,&\text{в противном случае}
\end{cases}
  • THRESH_BINARY_INV: dst(x,y)=\begin{cases}
0,&\text{если $src(x,y)>thresh$}\\
maxVal,&\text{в противном случае}
\end{cases}
  • THRESH_TRUNC: dst(x,y)=\begin{cases}
thresh,&\text{если $src(x,y)>thresh$}\\
src(x,y),&\text{в противном случае}
\end{cases}
  • THRESH_TOZERO: dst(x,y)=\begin{cases}
src(x,y),&\text{если $src(x,y)>thresh$}\\
0,&\text{в противном случае}
\end{cases}
  • THRESH_TOZERO_INV: dst(x,y)=\begin{cases}
0,&\text{если $src(x,y)>thresh$}\\
src(x,y),&\text{в противном случае}
\end{cases}
4.2.10. Поиск контуров на бинарном изображении

Рассмотрим функцию findContours для определения контуров объектов на бинарном (черно-белом) изображении. Данная функция реализует алгоритм, описанный в работе [21]. Позднее будет разработано приложение, демонстрирующее ее использование. Ниже приведены прототипы соответствующей функции.

void findContours(const Mat& image,  
                  vector<vector<Point> >& contours,  
                  vector<Vec4i>& hierarchy, int mode,  
                  int method, Point offset=Point()) 
void findContours(const Mat& image,  
                  vector<vector<Point> >& contours,  
                  int mode, int method,  
                  Point offset=Point()) 
                  

Функция принимает на вход одноканальное 8-битное изображение image и возвращает набор контуров contours, каждый из которых задается совокупностью точек. Опционально функция возвращает иерархию отношений между контурами hierarchy, для каждого контура contours[i] в hierarchy[i][0], hierarchy[i][1], hierarchy[i][2], hierarchy[i][3] хранятся индексы следующего и предыдущего контуров того же уровня иерархии, индексы первого дочернего и родительского контуров соответственно. Если какого-либо элемента приведенной последовательности нет, то в соответствующей ячейке хранится отрицательное значение. Наряду с описанными параметрами функция принимает идентификаторы способа восстановления контура mode и метода аппроксимации контура method. Параметр mode может принимать следующие значения:

  • CV_RETR_EXTERNAL обеспечивает восстановление только внешних контуров, т.е. hierarchy[i][2]= hierarchy[i][3] = -1;
  • CV_RETR_LIST позволяет восстанавливать все контуры без установления иерархии;
  • CV_RETR_CCOMP обеспечивает восстановление всех контуров (внешних и внутренних) и собирает их в двухуровневую иерархию;
  • CV_RETR_TREE предоставляет возможность получения полной иерархии контуров.

Перечислим возможные значения параметра method.

  • CV_CHAIN_APPROX_NONE – метод, согласно которому хранятся все точки контуров;
  • CV_CHAIN_APPROX_SIMPLE обеспечивает хранение горизонтальных, вертикальных и диагональных сегментов, сохраняя только их конечные точки;
  • CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS обеспечивают применение одной из разновидностей алгоритма Тех-Чин (Teh-Chin) [23].

Осталось сказать несколько слов о последнем параметре offset функции findContours. Данный параметр задает постоянное смещение каждой точки контура. Как правило, используется в случае, если поиск контура выполняется в некоторой области интереса, а отображение контуров необходимо выполнить на полном изображении.

4.2.11. Отображение контуров на изображении

На данный момент известно, как получить контуры объектов на изображении, и можно переходить к вопросу, как отобразить полученные контуры. Такой функционал сосредоточен в функции drawContours, которая позволяет отобразить на изображении image контур contours[contourIdx] посредством отрисовки линии, имеющей цвет color и толщину thickness. Наряду с этим можно указать тип связности линии lineType (8, 4, CV_AA). Опционально также можно передать иерархию контуров hierarchy, максимальное количество уровней иерархии для отображения maxLevel и сдвиг каждой точки контура offset.

void drawContours(Mat& image,  
                  const vector<vector<Point> >& contours,  
                  int contourIdx, const Scalar&  color,  
                  int thickness=1, int lineType=8,  
                  const vector<Vec4i>&  
                           hierarchy=vector<Vec4i>(),  
                  int maxLevel=INT_MAX,                    Point offset=Point()) 
                  
< Лекция 7 || Самостоятельная работа 1: 1234567891011 || Самостоятельная работа 2 >
Андрей Терёхин
Андрей Терёхин

Нахожу в тесте вопросы, которые в принципе не освещаются в лекции. Нужно гуглить на других ресурсах, чтобы решить тест, или же он всё же должен испытывать знания, полученные в ходе лекции?

Демянчик Иван
Демянчик Иван

В главе 14 мы видим понятие фильтра, но не могу разобраться, чем он является в теории и практике.

" Искомый объект можно описать с помощью фильтра F= \lbrace f_{x',y'},x' \in \lbrace0, ...,w_f \rbrace , y' \in \lbrace 0,...,h_f \rbrace \rbrace "