Распознавание образов для программистов

ВНИМАНИЕ! БЛОГ ПЕРЕЕХАЛ ПО АДРЕСУ
RECOG.RU

23 Февраль 2010

16. Стереозрение: перевод «различий» в реальные расстояния

написано в рубрике: OpenCV, Стереозрение — Кручинин Александр @ 12:03 ДП

Если посмотреть пример, приведённый в листинге 15.1, то видно, что в файл записываются не расстояния до объектов, а так называемые «различия». Число 16 в функции cvCreateStereoGCState – это общее количество «различий» по глубине (Рис. 16.1 [1]).

Рис. 16.1. Все точки разбиваются по плоскостям, количество которых задаётся «различиями» – disparity
Рис. 16.1. Все точки разбиваются по плоскостям, количество которых задаётся «различиями» – disparity

Для перевода к реальным расстояниям можно воспользоваться функцией ReprojectImageTo3D.

 

ReprojectImageTo3D

 

void cvReprojectImageTo3D(

const CvArr* disparity,

CvArr* _3dImage,

const CvMat* Q

);

Параметры:

disparity

Карта различий.

_3dImage

Выходное изображение в 3D формате – 3-канальное, 16-bit integer или 32-bit floating-point.

Q

Матрица перепроектирования 4×4.

 

Самые интересный – это третий параметр. Как его получить? В документации написано – с помощью функции cvStereoRectify. Т.е. после калибровки камеры на выходе получится нужная матрица. А если хочется только попробовать, как эта штука работает? Тогда обращаемся к книге «Learning PpenCV» и смотрим, что представляет из себя матрица:

           16.2.          (16.1)

Чтобы не быть голословным, объясняя параметры матрицы, обратимся к рисунку 16.2.

 

Рис. 16.2. Стерео координатная система
Рис. 16.2. Стерео координатная система

Tx – расстояние между камерами по оси X (предполагается, что координаты Y одинаковы); f – фокусное расстояние; cx, cy – координаты точки на главном (центральном) луче левой камеры; cx – x координата на правом изображении левой точки (это делается для того, что уточнить, как связано расстояние между камерами и количество пикселей).

Если всё ещё непонятно, то можете откомпилировать пример из OpenCV по калибровке камер, и посмотреть какие там получаются значения матриц:

-                              Q             0×0012f17c            double [4][4]

-                              [0]           0×0012f17c            double [4]

                               [0]           1.0000000000000000            double

                               [1]           0.00000000000000000          double

                               [2]           0.00000000000000000          double

                               [3]           -327.73883438110352           double

-                              [1]           0×0012f19c            double [4]

                               [0]           0.00000000000000000          double

                               [1]           1.0000000000000000            double

                               [2]           0.00000000000000000          double

                               [3]           -239.84486865997314           double

-                              [2]           0×0012f1bc            double [4]

                                [0]           0.00000000000000000          double

                               [1]           0.00000000000000000          double

                               [2]           0.00000000000000000          double

                               [3]           524.04542174159019            double

-                              [3]           0×0012f1dc            double [4]

                               [0]           0.00000000000000000          double

                               [1]           0.00000000000000000          double

                               [2]           -0.30009508961926923         double

                               [3]           1.2438668093184739            double

 

Используя эти значения матрицы, или другие (смоделированные вами), можно вызвать функцию ReprojectImageTo3D (Листинг 16.1.)

 

Листинг 16.1. Перевод в 3D формат изображения

           IplImage *_3dImage=cvCreateImage( cvSize(image->width,image->height), 32, 3);

            cvReprojectImageTo3D(disparity,_3dImage,&_Q);

            cvSaveImage( “disparity1.jpg”, _3dImage );

            cvSave( “disparity1.png”, _3dImage );

 

На выходе будет массив точек, каждая из которых задаётся координатами x, y, z.

 

Литература:

1. Bradsky G., Kaehler A. Learning OpenCV – O’Reilly, 2008. – 555 p.

13 Февраль 2010

S6. ПОВЫШЕНИЕ ЭФФЕКТИВНОСТИ СИСТЕМ ДЕТЕКТИРОВАНИЯ ДВИЖЕНИЙ НА ОСНОВЕ ПРИНЦИПА РАЗУМНОЙ ДОСТАТОЧНОСТИ

написано в рубрике: Распознавание образов — Кручинин Александр @ 6:37 ДП

Кручинин, А.Ю. Повышение эффективности систем детектирования движений на основе принципа разумной достаточности : Сборник статей XI международной научно-технической конференции «Информационно-вычислительные технологии и их приложения» / А.Ю. Кручинин. – Пенза: РИО ПГСХА, 2009. – С. 157-162.

http://vidikon.com/doc/text1007.doc

Большинство современных систем видеонаблюдения, например, Ewclid, Megasense, TRASSIR, имеют функцию детектирования движений. Некоторые из них, например VGuard, при обнаружении движений позволяют увеличивать частоту кадров для повышения качества изображения фиксируемого объекта. В системах, где за детектирование движений на различных камерах отвечает один вычислительный центр, имеет значение оптимальное распределение ресурсов. Однако в таких системах детектирования не предусмотрена возможность управления частотой кадров на основе принципа разумной достаточности, который бы позволял оптимально использовать вычислительную мощность для каждого потока видеоинформации.

За прототип взята функционирующая по принципу разумной достаточности модель динамической оптимизации, описанная в работе [1]. На рисунке 1 представлена модель системы детектирования движения с присутствием одной камеры.

 

Рис. 1. Модель системы детектирования движения с одной камерой
Рис. 1. Модель системы детектирования движения с одной камерой

На вход модели поступает вектор параметров:

V = {U0, [Umin, Umax], γ, K*},                                      (1)

где U0 – начальное значение параметров управления камерой; [Umin, Umax] – диапазон изменения параметров управления; γ – чувствительность детектора движения; K* – критерий оптимальности.

Первоначально устанавливаются значения параметров управления равные входным параметрам U = U0. К параметрам управления относятся: размеры изображения (ширина, высота), глубина цвета, сжатие и частота кадров f. Диапазон изменения параметров состоит из минимальной fmin и максимальной fmax частот кадров.

Камера принимает графическую информацию X и формирует производный видео поток λ на детектор движения:

λ = X’ (t),                                                        (2)

где X’ – формируемый камерой кадр изображения.

Детектор движения на основе заданной чувствительности γ (площадь изображения, на которой произошли изменения), сигнализирует о движении M и сохраняет скриншот экрана X”. Показатель движения M состоит из нескольких областей движения на экране:

M = {m1, m2, …, mi, …  mL}, mi: {x, y, w, h},                                   (3)

где L – общее количество областей движения; x, y, w, h – левая и верхняя координаты, ширина и высота области соответственно.

Функционирование блока выбора оптимального режима при наличии одной камеры не отличается от существующих аналогов – увеличение частоты кадров при обнаружении движения. Поэтому далее будет рассмотрен случай детектирования движения при наличии нескольких камер (Рис.2).

 

Рис. 2. Модель системы детектирования движения с несколькими камерами
Рис. 2. Модель системы детектирования движения с несколькими камерами

Так как настройка чувствительности детекторов движения производится при инициализации системы, то для упрощения из модели было удалено их управление. На рисунке N – общее число камер и детекторов движения. Детекторы движения, как и блок выбора оптимального режима, могут быть оформлены в виде одного программного комплекса. Для обработки одного кадра в среднем тратится сK операций процессора, с учётом этого построены концептуальные графики зависимости загрузки центрального процессора компьютера от частоты кадров для различного числа камер (Рис. 3, а). 

Рис. 3. Концептуальные графики зависимостей: а) загрузки центрального процессора компьютера от частоты кадров для различного числа камер; б) максимальной частоты кадров от количества камер N
Рис. 3. Концептуальные графики зависимостей: а) загрузки центрального процессора компьютера от частоты кадров для различного числа камер; б) максимальной частоты кадров от количества камер N

Как видно из рисунка 3, б, при различном количестве камер возможна разная максимальная частота кадров. На практике значения данных графиков определяются конфигурацией системы детектирования – тип центрального процессора, объём и тип оперативной памяти, а также другие характеристики. Режим работы системы R характеризуется параметрами управления:

R = U = {U1, U2, …, UN}.                                           (4)

Ширина и высота изображений устанавливаются при инициализации системы согласно возможностям камер, из соображений установленных требований и необходимому быстродействию на различных участках видеонаблюдения. Частота кадров для каждой камеры формируется динамически, на основе поступающих параметров движения M. При выборе оптимального режима следует исходить из следующего критерия оптимальности K*: а) общее время обработки информации в единицу времени не должно превышать 100% загрузки центрального процессора; б) процессор не должен простаивать. Алгоритм выбора оптимального режима представлен на рисунке 4.

 

Рис. 4. Алгоритм выбора оптимального режима
Рис. 4. Алгоритм выбора оптимального режима

Перед выбором стратегии расчёта оптимального режима для каждого детектора движения вычисляется приоритет, зависящий от площади области, внутри которой произошло движение:

ρ1, ρ2, …, ρi, …, ρN ; rec6.5;                                 (5)

rec6.6; rec6.7;

где Si – площадь детектирования изображения с i-ой камеры; Smaxi – максимальная площадь, равная произведению высоты на ширину изображения; ρmax – максимальный приоритет, который выбирается при настройке системы, он показывает общее число возможных приоритетов, в самом простейшем случае их два.

В блоках стратегии осуществляется выбор частоты кадров для каждой камеры по следующим выражениям:

Стратегия 1:                               rec6.8;                                              (6)

Стратегия 2:                               rec6.9.                                              (7)

Операция по снижению приоритетов уменьшает значение приоритета каждого детектора движения на единицу, если он больше нуля. После выполнения стратегии осуществляется расчёт прогнозируемой производительности rec6.10, где rec6.11. Если прогнозируемая производительность превышает максимальную Cmax, что соответствует 100% загрузке процессора, то происходит переход к следующей стратегии или снижение приоритетов. В противном случае алгоритм заканчивает свою работу, а выбранные оптимальные параметры вступают в силу. Важное условие функционирования модели:

rec6.12.                                                          (8)

То есть при минимальных частотах для всех камер процессор должен будет способен обработать все кадры.

Предложенный в данной работе способ повышения эффективности систем детектирования особенно актуален в случаях, когда одновременно движение детектируется лишь на некотором небольшом проценте камер. И если в современных системах детектирования производительность вычислительной машины должна быть большей rec6.13, то используя данный подход производительность должна превышать rec6.14, где P – процент одновременного движения с максимальным приоритетом. Таким образом, используя вычислительный центр может обрабатывать большее количество камер и детекторов движения.

Данный подход был опробован на персональном компьютере с процессором Intel Core 2 Duo 2,2 ГГц с операционной системой Windows XP SP2 на базе бесплатной библиотеки от Intel OpenCV [2]. Приводимые ниже цифры можно считать лишь условными, так как загрузка вычислительного центра зависит от его быстродействия, количества процессоров и независимых ядер, используемого алгоритма детектирования, способа обработки видеопотока.

Для тестирования минимальная и максимальная частоты были выбраны 1 кадр/с и 10 кадров/с соответственно. Использовались четыре веб-камеры в режиме 640 на 480 пикселей. Степень загрузки процессора при одной, двух, трёх и четырёх одновременно работающих камерах и детекторах движения на максимальной частоте составила – 8%, 16%, 24% и 32% соответственно. При использовании описанного подхода к выбору режимов детектирования загрузка процессора при P равном 50% составила для двух камер примерно 9%, для четырёх камер – примерно 18%.

 

Литература:

1. Кручинин А.Ю., Аралбаев Т.З. Модель динамической оптимизации режимов мониторинга и диагностирования буровой скважины // Известия ОрелГТУ, серия «Информационные системы и технологии». – 2006. – № 1 (2). С. 81-85.

2. Bradsky G., Kaehler A. Learning OpenCV – O’Reilly, 2008. – 555 p. 

 

10 Февраль 2010

15. Стереозрение средствами OpenCV

написано в рубрике: OpenCV, Стереозрение — Кручинин Александр @ 11:45 ПП

OpenCV предоставляет для разработчиков функции стереозрения. О теории и внутреннем устройстве поговорим как-нибудь в другой раз, а в этом параграфе просто приведён пример работы с функциями. Для теста использовались картинки, которые используются повсеместно (Рис. 15.1-2).

Рис. 15.1. Левое изображение
Рис. 15.1. Левое изображение
Рис. 15.2. Правое изображение
Рис. 15.2. Правое изображение

В листинге 15.1 представлен программный код позволяющий получить трёхмерные координаты внутренних объектов.

 Листинг 15.1. Функции стереозрения на практике

      IplImage *image_ = 0;

      IplImage *image1_ = 0;

      //загрузка тестовых картинок

      image_ = cvLoadImage(”left.jpg”, 1 );

      image1_ = cvLoadImage(”right.jpg”, 1 );

      //создание дополнительных изображений

      IplImage *image_g = cvCreateImage( cvSize(image_->width,image_->height), 8, 1);

      IplImage *image1_g = cvCreateImage( cvSize(image_->width,image_->height), 8, 1);

      CvSize size = cvGetSize(image_);

      //создание матриц

      CvMat* disparity_left = cvCreateMat( size.height, size.width, CV_16S );

      CvMat* disparity_right = cvCreateMat( size.height, size.width, CV_16S );

      //перевод изображений к градациям серого

      cvCvtColor( image_, image_g, CV_BGR2GRAY );

      cvCvtColor( image1_, image1_g, CV_BGR2GRAY );

      //задание начальных параметров стереозрения

      CvStereoGCState* state = cvCreateStereoGCState( 16, 2);

      //выполнение основной функции стереозрения, возвращающей матрицу 3d

      cvFindStereoCorrespondenceGC( image_g, image1_g, disparity_left, disparity_right, state, 0 );

      cvReleaseStereoGCState( &state );

      //вывод матрицы в файл

      CvMat* disparity_left_visual = cvCreateMat( size.height, size.width, CV_8U );

      cvConvertScale( disparity_left, disparity_left_visual, -16 );

      cvSave( “disparity.png”, disparity_left_visual );

      cvSaveImage( “disparity.jpg”, disparity_left_visual );

      return 0;

 В результате в файле disparity.png будет искомая матрица, а в disparity.jpg – изображение представленное на рисунке 15.3.

Рис. 15.3. Результат работы функции стереозрения
Рис. 15.3. Результат работы функции стереозрения

Неинтересно смотреть на плоское изображение. Ни рисунках 15.4-15.5 показаны скриншоты из программы, строящей по матрице disparity.png трёхмерную картину.

Рис. 15.4. Трёхмерная визуализация без текстур
Рис. 15.4. Трёхмерная визуализация без текстур

 

Рис. 15.5. Трёхмерная визуализация с текстурой
Рис. 15.5. Трёхмерная визуализация с текстурой

 

По ссылке http://vidikon.com/download/stereo.zip вы можете скачать программу, которая и делает это.

8 Февраль 2010

14. Сравнение гистограмм

написано в рубрике: OpenCV — Кручинин Александр @ 6:15 ДП

Безусловно, что пользы от гистограмм не будет никакой, если не сравнивать их с эталонными диаграммами. Предположим, есть эталонное изображение – какой-то объект заданных размеров. Также есть множество неизвестных изображений, на которых нужно найти эталонное изображение. Для этого нужно перебирать участки изображений, сравнивая содержимое с эталоном. Можно сравнивать каждую точку из участка, но это будет медленно. Гораздо быстрее по ресурсам – это сравнить гистограммы яркости. Для сравнения гистограмм в OpenCV предусмотрена функция cvCompareHist().

 

cvCompareHist

 

double cvCompareHist(

const CvHistogram* hist1,

const CvHistogram* hist2,

int method

);

 

Параметры:

hist1

Первая гистограмма.

hist2

Вторая гистограмма.

method

Метод: CV_COMP_CORREL, CV_COMP_CHISQR, CV_COMP_INTERSECT или CV_COMP_BHATTACHARYYA.

Функция возвращает меру близости одной гистограммы к другой.

 

Опишем вкратце методы сравнения гистограмм.

CV_COMP_CORREL – корреляционный метод

14.1,                            (14.1)

где , N равняется числу столбцов гистограммы.

Возвращаемое значение лежит в интервале [-1,1], 1 – максимальное соответствие, -1 – максимальное несоответствие, 0 – нет никакой корреляции.

CV_COMP_CHISQR – хи-квадрат

14.2.                            (14.2)

Возвращаемое значение лежит в интервале [0, неограниченно). 0 – максимальное соответствие, а крайнее несоответствие зависит от количества элементов гистограммы.

CV_COMP_INTERSECT – пересечение

14.3.                               (14.3)

Если гистограммы нормализованы к 1, то совершенное соответствие гистограмм это 1, а совершенное несоответствие – 0.

CV_COMP_BHATTACHARYYA – расстояние Бхатачария

14.4.                      (14.4)

Совершенное соответствие – это 0, несоответствие – это 1.

На рисунке 14.1 показано сравнение этих методов.

Рис. 14.1. Методы сравнения гистограмм
Рис. 14.1. Методы сравнения гистограмм

Сравниваются гистограммы состоящие из двух элементов. Эталон – это самая верхняя модель, а 3 нижние – гистограммы полученные с каких-то тестовых образов.

7 Февраль 2010

13. Гистограммы в OpenCV

написано в рубрике: OpenCV — Кручинин Александр @ 12:03 ДП

Для анализа участков изображений можно использовать гистограммы яркости (см. http://blog.vidikon.com/?p=87).

В книге «Learning OpenCV» приведён хороший рисунок, иллюстрирующий построение гистограмм, я без изменений приведу его ниже (Рис. 13.1).

Рис. 13.1. Построение гистограммы
Рис. 13.1. Построение гистограммы

Из рисунка становится совершенно понятно, как строятся гистограммы. Естественно, что гистограммы (в совокупности с другими методами) можно использовать для распознавания изображений. Для получения гистограммы используется функция  cvCreateHist().

 

cvCreateHist

 

CvHistogram* cvCreateHist(

int dims,

int* sizes,

int type,

float** ranges=NULL,

int uniform=1

);

 

Параметры:

dims

Число измерений гистограммы.

sizes

Массив, содержащий в себе столбцы гистограммы.

type

Формат гистограммы. CV_HIST_ARRAY или CV_HIST_SPARSE, характеризующие способ хранения гистограммы.

ranges

Массив диапазонов гистограммы, используемый для определения к какому элементу относится входной пиксель.

uniform

Флаг однородности.

 

Функция создаёт гистограмму указанного размера и возвращает указатель на созданный объект. Пример создания гистограммы представлен в листинге 13.1.

 

Листинг 13.1. Создание гистограммы

int hist_size = 64;

      float range_0[]={0,256};

      float* ranges[] = { range_0 };

     

      CvHistogram *hist;

      IplImage *hist_image = cvCreateImage(cvSize(320,200), 8, 1);

hist = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);

      cvCalcHist( &gray, hist, 0, NULL );

 

      int bin_w;

      bin_w = cvRound((double)hist_image->width/hist_size);

      cvSet( hist_image, cvScalarAll(255), 0 );

      for( i = 0; i < hist_size; i++ )

cvRectangle( hist_image, cvPoint(i*bin_w, hist_image->height),

cvPoint((i+1)*bin_w, hist_image->height – cvRound(cvGetReal1D(hist->bins,i))),

                     cvScalarAll(0), -1, 8, 0 );

 

      cvNamedWindow( “histogram”, 1 );

      cvShowImage( “histogram”, hist_image );

 

В листинге сначала создаётся картинка, куда будет выводиться гистограмма, затем создаётся объект гистограммы hist. После чего высчитывается с помощью функции cvCalcHist() сама гистограмма по изображению gray, которое должно быть в градациях серого. Если вы хотите построить гистограмму цветного изображения, то вам понадобится 3-х размерная гистограмма по градациям красного, зелёного и синего. После вычисления гистограммы необходимо вывести её в изображение.

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

Рис. 13.2. Пример полученной гистограммы
Рис. 13.2. Пример полученной гистограммы
Старые записи »

Работает на WordPress