Решение проблемы низкой FPS на некоторых USB камерах

Столкнулся с проблемой в Windows, что камеры на новых ноутбуках и некоторые новые камеры при разрешениях выше 640x480 дают низкое значение FPS использованием видеопотока OpenCV (неважно Си или Си++ интерфейс).
В моем случае было 3 камеры (2 внешние и одна ноутбука), которые ставили разрешение 1280x760, но только одна при этом давала 30 FPS, остальные две камеры давали значение 10 FPS.

Естественно первая идея — установить FPS с помощью CV_CAP_PROP_FPS, но оно не работает для камер. Тогда пришлось смотреть исходники OpenCV и выяснять в каких режимах работает камера.


( Читать дальше )

Распознавание и слежение за знаком скорости

Распознавание знака скорости и слежение за ним. Все выполняется довольно быстро — на 1 ядре процессора AMD FX(tm)-6100 Six-Core выделенная зона распознается за 0.017с. (полное FullHD изображение где-то в среднем на одном ядре за 0.032с — но анализ всего изображения не нужен. Достаточно распознавать указанную область).

Контурный анализ - детектирование зашумленного бинарного объекта

Бинарный объект

Бинарный объект – это объект, созданный человеком, и находящийся в поле зрения камеры. К таким объектам относятся дорожные знаки, автомобильные номера, баркоды и т.п. Часто эти объект имеют контур, по которому они достаточно хорошо детектируются. Однако возникают ситуации, когда объекты серьезно наклонены к оси камеры в нескольких плоскостях, а при этом на них накладывается шум:

Здесь: (а) исходный объект, (б) искаженный объект в результате поворота к камере, (в) зашумленный объект
Для правильного распознавания объекта необходимо провести перспективное преобразование. Но для этого необходимо получить 4 точки бинарного объекта.
Цель данной публикации: определить 4 точки в зашумленном объекте изначальной прямоугольной формы.


( Читать дальше )

Максимально стабильные экстремальные области

В компьютерном зрении, максимально стабильные экстремальные регионы (MSER) используются в качестве метода обнаружения больших двоичных объектов в изображениях. Предложен в работе:
J. Matas, O. Chum, M. Urban, and T. Pajdla. «Robust wide baseline stereo from maximally stable extremal regions.» Proc. of British Machine Vision Conference, pages 384-396, 2002.
http://cmp.felk.cvut.cz/~matas/papers/matas-bmvc02.pdf
В OpenCV есть пример их использования mser_sample.cpp, текст которого приведен ниже


( Читать дальше )

Потоковое распознавание автомобильных номеров

В версии 1.21 iANPR SDK планируется изменить потоковый модуль, добавив дополнительную функциональность: траектория номера, пересечение траектории номера линий. На следующем видео показано, как будет работать пример:

Ускоренное сравнение с шаблоном

Здесь http://recog.ru/blog/opencv/57.htm показано, как использовать функции OpenCV cvMatchTemplate для сравнения с эталоном.
Недавно появилась статья «Tirui Wu, Alexander Toet Speed-Up Template Matching Through Integral Image Based Weak Classifiers // Journal of Pattern Recognition Research 1 (2014) 1-12.» (http://www.jprr.org/index.php/jprr/article/viewFile/516/193), в которой показано, как можно значительно ускорить процесс поиска шаблона.
Алгоритм работы следующий:
1. Шаблон и само изображение переводится к интегральному виду (т.е. в дальнейшем используются интегральные изображения).
2. Для шаблона вычисляется множество «слабых» бинарных блоков. Что такое «слабый» (weak) бинарный блок можно понять из следующего рисунка:



( Читать дальше )

Распознавание индустриальных баркодов DataMatrix с произвольным углом наклона и поворота камеры

Представлен алгоритм распознавания двумерных индустриальных кодов DataMatrix, позволяющий идентифицировать коды, нанесённые ударно-точечным или капельным методами на поверхности со сложным фоном. Алгоритм может адаптироваться в случаях изменения фона на основе смены режима бинаризации.
http://www.computeroptics.smr.ru/KO/PDF/KO38-4/380442.pdf

Нормальный Байесовский классификатор в OpenCV

Байесовский классификатор является самым простым методом обучения и часто достаточным при правильном использовании – при правильном выборе признаков распознавания. Классическая задача Байесовского классификатора – это определение наиболее вероятного образа из двух возможных.
Возьмем два образа нормального распределения (здесь и далее я не вдаюсь в подробности, предполагая, что читатель знает об одномерном распознавании образов).
Образ1: мат. ожидание = 10, среднее квадратичное отклонение = 1
Образ2: мат. ожидание = 12, среднее квадратичное отклонение = 1
Если построить для них распределения, то они будут выглядеть следующим образом:


( Читать дальше )

Распараллеливание с iANPR SDK и OpenMP

В библиотеке iANPR SDK нет встроенного распараллеливания, т.е. функция распознавания выполняется в одном потоке. Однако, когда производится работа с большими изображениями, например, 1920x1080, время распознавания на обычном ПК может быть недостаточно для работы в реальном времени. Для решения данной проблемы можно разбить изображение на части и анализировать их параллельно. Здесь, однако, следует помнить, что в случае попадания номера на пересечение частей, то он не будет распознан. Поэтому нужно внести некоторую избыточность, используя пересекающиеся части. Причем уровень пересечения определяется максимально возможными размерами объекта распознавания.
Предположим, что объект распознавания в форме круга, и его максимальный диаметр на изображении составляет Dmax. Тогда ширина области пересечения сегментов должна быть больше Dmax. В этом случае площадь несколько раз анализируемой области (в разных сегментах) будет рассчитываться по следующей формуле:
S = L * Dmax,
где L – длина границ между всеми сегментами. Понятно, что в этом случае S будет зависеть не только от количества сегментов, но и от их формы. На рисунках ниже показано два примера расположения сегментов. Один сегмент серого цвета, а другой белого. Область пересечения показана штрихами.


( Читать дальше )

Основы работы с матрицами в OpenCV (C++ интерфейс)

Чтобы разрабатывать собственные алгоритмы компьютерного зрения, необходимо уметь получать доступ к пикселям. Изображение представляет собой двумерную матрицу, которая представлена в виде класса cv::Mat. Каждый элемент матрицы представляет собой один пиксель. Для изображений в градациях серого элемент матрицы представлен 8-битным числом без знака (от 0 до 255). Для цветного изображения в формате RGB таких чисел 3, по одному на каждую компоненту цвета. Формат класса cv::Mat следующий.
class CV_EXPORTS Mat
{
public:
// ... много методов ...
...

/*! включает в себя несколько битовых полей:
- сигнатура
- флаг непрерывности
- глубина
- количество каналов
*/
int flags;
//! размерность массива, >= 2
int dims;
//! количество строк и столбцов или (-1, -1) 
int rows, cols;
//! указатель на данные
uchar* data;

//! указатель на счетчик ссылок; когда массив указан
// на выделенные пользователем данные, то указатель равен NULL
int* refcount;

// другие члены
...
};


( Читать дальше )