Детектирование QR Code с помощью средств OpenCV / Распознавание штрих-кодов (бар кодов) / Recog.ru - Распознавание образов для программистов


Детектирование QR Code с помощью средств OpenCV

Распознавание двухмерных кодов является актуальной задачей, впрочем, уже решенной на ряде устройств и персональных компьютерах. Однако на настоящий момент отсутствуют BSD версии библиотек распознавания, а ограниченные лицензии в большинстве случаев не позволяют использовать открытые исходные кода для своих целей.
Популярный в Японии QrCode является одним из наиболее оптимальных кодов, хотя при малых размерах кода квадраты-мишени отнимают много места. На рисунке 1 приведен пример кода Qr с закодированной фразой «Test code».

Рис. 1. Пример кода Qr («Test code»)

Рис. 1. Пример кода Qr («Test code»)



Описание принципов кодирования-декодирования кода доступно в спецификации [1]. Принципы нахождения границ кода с произвольным углом наклона и поворота камеры описаны в работах [2, 3]. Однако возникает вопрос: можно ли с помощью средств известной библиотеки OpenCV упростить распознавание кода? Можно. И пример такого упрощения представлен в библиотеке libdecodeqr.

 
Для начала упростим задачу. Пусть необходимо найти местонахождение 4-х граничных точек кода, причем ось камеры примерно перпендикулярна плоскости кода, а сам код может быть повернут в плоскости не более, чем на 30 градусов (по сравнению с рис.1 в обе стороны). Процесс нахождения местоположения кода можно разбить на несколько этапов.
1. Перевод в монохромное изображение.Осуществляется перевод изображения из полноцветного в градации серого с помощью функции cvCvtColor, а затем перевод в монохромное с помощью функций cvThreshold или cvAdaptiveThreshold.
2. Выделение контуров.На преобразованном изображении находятся контура с использованием функции cvFindContours.
3. Поиск квадратов.Далее необходимо найти, какие контура можно условно считать квадратами. Для этого необходимо выяснить ограничивающую зону контура с помощью cvBoundingRect, воспользоваться функций cvContourArea для вычисления внутренней области контура.

CvRect cvBoundingRect( 
	CvArr* points, 
	int update=0
	);

Функция возвращает ограничивающий четырехугольник для массива точек.
double cvContourArea(
	const CvArr* contour,
	CvSlice slice=CV WHOLE SEQ
	);

Функция возвращает площадь контура contour.

После, если площадь контура не намного отличается от ограничивающего четырёхугольника, то можно считать его квадратом.
4. Проверка на наличие внутренних квадратов. Если у найденных квадратов есть внутренние квадраты, то будем считать эти квадраты мишенями. Найденных мишеней в нашем случае должно быть 3.
5. Поиск четырех точек. Для поиска 4-х точек необходимо определить 4 угловые точки для каждой мишени с помощью функций cvMinAreaRect2 и cvBoxPoints.

CvBox2D cvMinAreaRect2(
	const CvArr* points,
	CvMemStorage* storage=NULL
	);

Функция возвращает прямоугольник с минимальной площадь, ограничивающей точки points.

void cvBoxPoints(
	CvBox2D box,
	CvPoint2D32f pt[4] 
	);

Функция для найденного прямоугольника CvBox2D возвращает 4 угловые точки pt.

Из найденных точек для 3-х мишеней нехитрыми действиями выбираются 3 крайние точки кода. 4-ая точка может быть получена двумя способами: а) воспользоваться функцией cvBoxPoints для ограничения всех точек всех мишеней – в результате будет найдена 4 точка (но не очень точно); б) по двум крайним точкам нижней и правой мишеней определить направляющую линию, на линии пересечения которой будет находиться искомая точка. результат смотрите на рисунке 2.
Рис. 2. Найденные крайние точки кода
Рис. 2. Найденные крайние точки кода

При несильном искажении кода по полученным точкам можно разбить код на сетку, в которой определить, пустая или полная ячейка. При сильных искажениях, сетку придется масштабировать с разными размерами ячеек, синхронизируясь по дополнительным элементам.

Литература:
1. ISO/IEC 18004:2006 Information technology — Automatic identification and data capture techniques — QR Code 2005 bar code symbology specification.
2. «Barcode readers using the camera device in mobile phones» Ohbuchi, E. Hanaizumi, H. Hock, L.A. ,Cyberworlds, 2004 International Conference on, page 260 – 265.
3. blog.vidikon.com/?p=411 Распознавание двухмерных штрих кодов с произвольным углом наклона и поворота камеры


  • +2
  • 03 апреля 2011, 16:52
  • vidikon

Комментарии (2)

RSS свернуть / развернуть
+
0
Исходники к этой статье можно где нибудь посмотреть?
avatar

Iliya

  • 24 июля 2011, 18:51
+
0
К сожалению, нет. Исходники для свободного доступа я обычно сам выкладываю. Надеюсь, на понимание.
avatar

vidikon

  • 24 июля 2011, 19:57

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.