СИСТЕМА РАСПОЗНАВАНИЯ ОТОБРАЖАЕМЫХ ДАННЫХ ОБЪЕКТА

ВВЕДЕНИЕ
Разработанная система предназначена для бесконтактного распознавания данных объекта выводимых на его дисплей. Система является частью средств для тестирования объекта по данным диалога между объектом и пользователем.
Тестирование систем, имеющих доступ к программным или аппаратным каналам вывода информации пользователя не требует распознавания данных. Однако, когда такое подключение к данным объекта отсутствует, его можно выполнить при помощи бесконтактной системы распознавания, которая может обеспечить длительное наблюдение за состоянием объекта в автоматическом режиме.
В этой работе обсуждаются средства распознавания без использования нейронных сетей, эффективность которых, в значительной мере, зависит от результатов обучения.
Особенности разработанной системы показаны на примере распознавания данных дайв-компьютера компании Open Safety Equipment Ltd.
Статья содержит следующие разделы.
• Библиотечные функции обработки изображений МатЛАБ
• Характеристики используемой веб камеры, подключение камеры к среде МатЛАБ, настройка режимов камеры.
• Распознавание символов с использованием корреляционных функций.
• Интерфейс пользователя системы распознавания и результаты распознавания

БИБЛИОТЕЧНЫЕ ФУНКЦИИ ОБРАБОТКИ ИЗОБРАЖЕНИЙ МАТЛАБ
MatLAB имеет библиотеки функций для работы с графическими файлами и видеосигналами. Ниже даны используемые варианты библиотечных функций.
Считывание изображения графического файла
>> pct = imread('DC_OS.jpg');

Рис. 1. RGB изображение [1] JPG файла в формате <196x259x3 uint8>

Поддерживаемые форматы входных файлов BMP, CUR, GIF, HDF4, ICO, LPEG, JPEG 2000, PBM, PCX, PGM.

Добавление графического примитива к изображению
Imf = insertShape(pct, 'Rectangle', [32, 27, 220, 153], 'Color', 'green'); % к исходной картинке pct добавлена прямоугольная рамка зеленого цвета.

Рис. 2. Изображение pct с прямоугольной рамкой зеленого цвета, <240x320x3 uint8>.

m-код добавления примитивов к видеокадрам:
clear all
pos_triangle = [183 297 302 250 316 297];
pos_hexagon = [340 163 305 186 303 257 334 294 362 255 361 191];

%webcamlist;
cam = webcam(1);

for i = 1:100
%считывание кадра веб камеры
I = snapshot(cam);
% добавление круга
RGB = insertShape(I, 'circle', [150 280 35], 'LineWidth', 5);
% добавление треугольника и многоугольника
RGB = insertShape(RGB, 'FilledPolygon', {pos_triangle, pos_hexagon}, 'Color', {'white', 'green'}, 'Opacity', 0.7);
figure(2), imshow(RGB); % вывод результата на графопостроитель
end

Рис. 3. Видеоизображение с добавленными геометрическими примитивами.

Уменьшение изображения
Уменьшение изображения в 2N раз достигается соответствующим уменьшением количества пикселов изображения по каждой координате.
%Установка параметров сжатия в 4 раза (как 2^2)
gaussPyramid = vision.Pyramid('PyramidLevel', 2);

%Считывание изображения tif файла, перевод серого цвета из uint8 в single
I = im2single(imread('DC_OS.jpg'));
J = step(gaussPyramid, I); сжатие

%Отображение исходной и сжатой картинок
figure, imshow(I); title('Original Image');
figure, imshow(J); title('Reduced Image');

Рис. 4. Уменьшение изображения в 4 раза.

Изменение размера изображения
pct=imresize(pct,[400 NaN]); % Изменение размеров матрицы pct изображения с сохранением отношения между сторонами, например, с <196 x 259 x 3 uint8 > в <400 x 529 x 3 uint8 >
Выделение фрагмента изображения
Imf = imcrop(pct_bw, [32, 27, 220, 153]); % Из файла выделяет фрагмент <154 x 221 x 3 uint8 >
Преобразование RGB изображения в палитру серого
pct_bw=rgb2gray(pct); % Преобразование RGB <196 x 259 x 3 uint8 > в <196 x 259 uint8 >

Рис. 5. Приведение RGB изображения к полутонам серого.

Фильтрация изображения
2d медианная фильтрация изображений в полутонах серого
pct_filt=medfilt2(pct_bw,[3 3]); % Медианный фильтр для устранения шума.

Размытие изображения
se=strel('disk',6); % Создание морфологического структурного элемента (STREL)- массив 0 и 1 с расположением единиц в виде круга, эллипса, квадрата
pct_dilasi=imdilate(pct_filt,se); % Размытие изображения

Рис. 6. Примеры размытия левого изображения.

Утонение сплошных элементов изображения
pct_eroding=imerode(pct_filt,se); % Eroding the gray image with structural element

Рис. 7. Пример утонения сплошных элементов изображения.

Вычитание константы из изображения или другого изображения
pct_edge_enhacement=imsubtract(pct_dilasi,pct_eroding); % вычитание из pct_dilasi pct_eroding

Программа подготовки и вычитания изображений:
pct = imread('DC_OS.jpg');
pct_bw=rgb2gray(pct);

se=strel('disk',1);
pct_eroding=imerode(pct_bw,se);

pct_edge_enhacement=imsubtract(pct_bw,pct_eroding);
figure, imshow(pct_edge_enhacement);

Рис. 8. Результат (справа) вычитания среднего изображения из левого.

Конвертирование матрицы в изображение серых тонов
pct_edge_enhacement_double=mat2gray(double(pct_edge_enhacement)); % конвертирование 196 x 258 uint8 [0… 255] > 196 x 258 double [0… 255] > 196 x 258 double [0… 1]

2d свёртка
pct_double_konv=conv2(pct_edge_enhacement_double,[1 1;1 1]); % Свёртка double изображения

Рис. 9. Действие свертки.

Масштабирование интенсивности изображения
pct_intens=imadjust(pct_double_konv,[0.5 0.7],[0 1],0.1); % Интенсивность [0.5 0.7] или 128… 179 масштабируется в [0 1] или 0… 255; 0.1 — gamma

Рис. 10. Масштабирование интенсивности.

Преобразование числовой матрицы в логическую
pct_logic=logical(pct_intens); % Преобразование double или uint8 в binary; все, что > 0 становится 1.

Рис. 11. Преобразование <196 x 256 double> матрицы в бинарную <196 x 256 logical>

Заливка оконтуренных элементов
pct_fill=imfill(pct_line_delete,'holes');

Рис. 12. Заливка элементов с безразрывными контурами <196 x 256 double>

Удаление сплошных (островковых) фрагментов (шумов) из бинарного изображения
pct_final=bwareaopen(pct_logic,500); % удаляет «белые == 1» объекты > 500 пикселей

Рис. 13. Удаление «черных == 0» фрагментов размерами более 500 пикселей с применением инверсии NOT.

Код программы:
pct_double = double(imread('DC_OS.jpg'))./256;
pct_gray =rgb2gray(pct_double);

pct_logic=logical(pct_gray); % бинарное изображение
pct_logic_inv=not(logical(pct_logic)); % инверсия

pct_final_inv =bwareaopen(pct_logic_inv,500); % удаление «белых объектов»

pct_final=not(pct_final_inv); % восстановление
figure, imshow(pct_final);

Выделение фрагментов (островков) бинарного изображения
[labelled jml] = bwlabel(pct_final);
% находит “островки” единиц и присваивает им порядковый номер. labelled – изображение с пронумерованными островками, lml – количество найденных островков.

Рис. 14. Фрагмент десяти пронумерованных “островковых” групп единиц бинарного изображения.

Нахождение координат и размеров островковых зон
Iprops=regionprops(labelled,'BoundingBox','Image');

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

Гистограмма
Гистограмма imhist(Img_reference) позволяет получить зависимость количества пикселей для каждой интенсивности.

Рис. 16. Изображение (слева) и его гистограмма – количество полутонов серого. Гистограмма показывает, что в изображении преобладает черный цвет нулевой интенсивности: ~3500 точек.

Распределение интенсивностей

Рис. 17. Суммарное распределение интенсивности по строкам sum(Img).

Рис. 18. Слева — сумма интенсивности пикселей по строкам sum (Img) после медианного фильтра Img = medfilt2(Img,[5 5]). Справа — производная от суммы diff(sum(Img)).

Трехмерное построение видеоизображений.
Видеокадр можно представить в табличном виде, как это показано на Рис. 19 для символа 9.

Рис. 19. Табличное распределение интенсивности пикселей символа «9»в Excel.
Графопостроитель МатЛАБ имеет кнопку “Rotate 3D” (Рис. 20), которая позволяет отображать выводимые данные в 3d формате.

Рис. 20. Кнопка графопостроителя для перевода отображаемых данных в 3d формат.

Рис. 21. Примеры 3d изображений. Справа показаны символы «20». По вертикали отображается интенсивность пикселей.

ВИДЕОКАМЕРА
В проекте использовалась ВЕБ камера высокой четкости HD Logitech C52 [2].
Технические характеристики видеокамеры Logitech C52.
• Видеосвязь в формате HD (1280 x 720 пикселей)
• Видеосъемка в формате HD: до 1280 x 720 пикселей.
• Автофокусировка
• Фотографии: до 8 Мпикс (с программной обработкой)
• Встроенный микрофон с поддержкой технологии Logitech RightSound

Рис. 22. Внешний вид и параметры настройки видеокамеры Logitech C52.

Основные требования к компьютеру при разрешении камеры 1280 х 720 точек.
• Частота процессора 2.4 ГГц
• Объем ОЗУ 2 ГБ
• Свободное пространство на жестком диске 200 МБ
• USB порт 2.0
• Операционная среда: Windows XP (SP2 or higher), Vista или Windows 7 (32-бит или 64-бит)

Подключение видеокамеры к МатЛАБ
1. Проверьте входит ли видеокамера в список устройств МатЛАБ.
>> webcamlist
2. Если камеры нет в списке, подключите её, используя пакет Support Package Installer (см. Рис. 23)

Рис. 23. Подключение видеокамеры к МатЛАБ.

3. После успешной установки камера попадает в список
>> webcamlist

Подключение видеокамеры к Simulink
Видеокамеры National Instruments могут подключаться к среде Simulink МатЛАБ через объекты библиотеки Image Acquisition Toolbox > From Video Device. Для подключения необходимо установить пакет NI-DAQmx используя Support Package Installer (Рис. 23).
Запуск Image Acquisition Tool можно выполнить из командной строки МатЛАБ:
>>imaqtool

Порядок ввода видео в МатЛАБ
Ввод кадров в МатЛАБ выполняется в следующем порядке.
1. Поиск подключенных к компьютеру видеокамер распознаваемых MATLAB.
>> webcamlist
2. Создание объекта видеокамеры.
>> cam = webcam('Logitech') или
3. Просмотр RGB видео с выводом имени камеры, времени видео, разрешения и частоты кадров.
>> preview(cam)

Рис. 24. Вывод видео в МатЛАБ.

4. Установка требуемых параметров камеры.
cam = webcam (1)
Примеры структурного списка параметров камеры:
cam =
webcam with properties:
Name: 'Logitech HD Webcam C525'
Resolution: '640x480'
AvailableResolutions: {1x22 cell}
Brightness: 128
Contrast: 32
Focus: 60
Gain: 64

WhiteBalance: 5500
Tilt: 0
Exposure: -4
Pan: 0
Sharpness: 22
Saturation: 32
BacklightCompensation: 1
Zoom: 1
ExposureMode: 'auto'
cam =
webcam with properties:
Name: 'Logitech HD Webcam C525'
Resolution: '960x720'
AvailableResolutions: {1x22 cell}
Brightness: 128
WhiteBalanceMode: 'manual'
Pan: 0
Exposure: -5
Tilt: 0
FocusMode: 'manual'
BacklightCompensation: 1
WhiteBalance: 5900
ExposureMode: 'manual'

Sharpness: 30
Saturation: 32
Focus: 90 % 80, 85, 90, 95 adjust
Contrast: 32
Zoom: 1
Gain: 64

Получение возможных значений параметров, например, разрешения камеры
>> cam.AvailableResolutions
ans =
'640x480' '160x120' '176x144'
'320x176' '320x240' '432x240'
'352x288' '544x288' '640x360'
'752x416' '800x448' '864x480'
'960x544' '1024x576' '800x600'
'1184x656' '960x720' '1280x720'
'1392x768' '1504x832' '1600x896'
'1280x960'

Рис. 25. Изображения при разрешении '320x240' '640x480' и '1280x960' пикселов.
Установка требуемого значения параметра
>> cam.Resolution = '320x240';
5. Выход из режима просмотра видео.
>> closePreview(cam)
6. Ввод кадра.
>> img = snapshot(cam);
7. Отображение кадра.
>> imshow(img)
8. Удаление объекта камеры.
>> clear('cam');
Настройка положения камеры относительно объекта
К выводимому в МатЛАБ видео добавляется рамка с известными координатами (Рис. 26). При настройке положения камеры относительно объекта границы объекта должны совпадать с положением рамки.

Рис. 26. Рамка в видеокадре.

Пример m-кода для отображения видео с базовой рамкой:

webcamlist;
cam = webcam(1);
cam.Resolution = '320x240';

target_area = [45, 44, 217, 150];
while(1)
pct = snapshot(cam);
% display target
Imf = insertShape(pct, 'Rectangle', target_area, 'Color', 'green');
image(Imf);
end

Особенности состояний объекта
В процессе работы устройство меняет формат выводимой не экран информации. Система распознаёт смену формата по наличию/отсутствию полей TTS и Step. Для поля каждого формата построено свое распределение зон определения символов Рис. 27.

Рис. 27. Разные форматы информации выводимой тестируемым устройством.

РАСПОЗНАВАНИЕ ТЕКСТА
OCR функция МатЛАБ
Функция Optical Character Recognition (OCR) МатЛАБ распознает текст графического файла.

% Загрузка изображения
I = imread('DC_OS.jpg');

% Распознавание текста
results = ocr(I);

% Анализируемые зоны изображения
wordBBox = results.WordBoundingBoxes

% Вывод изображения и зон
figure;
Iname = insertShape(I, 'Rectangle', wordBBox, 'Color', 'red');
imshow(Iname);

Рис. 28. Зоны поиска символов (23 прямоугольные зоны выделены красным), координаты и размеры зон в results.WordBoundingBoxes.
Таблица 1. Результат распознавания текста.

Пример автоматического нахождения текстовых зон и распознавание текста в МатЛАБ
Пример автоматического распознавания текста в МатЛАБ показан в разделе Help МатЛАБ [3].

Рис. 29. Исходное изображение [3].

Нахождение фрагмента изображения по корреляционной функции
Вычисление нормированной взаимной корреляции norm_Corr_f позволяет отслеживать наличие заданных фрагментов и их координаты в кадрах видеоизображения. Это можно использовать, например, при поиске или подсчете объектов или настройке положения камеры.
Примеры реализации алгоритма обнаружения показаны на Рис. 30, Рис. 31, код алгоритма [4].

Рис. 30. Зона объекта — текста “Run Time”, правильно обнаруженная на левом кадре. При накрытии рукой зоны объекта программа поиска нашла неправильную область объекта (правый кадр).

Рис. 31. Зависимость корреляционной функции от номера кадра. Значение функции при наличии отыскиваемого объекта ~0.99, а при его отсутствии ~0.978. Малый диапазон изменения функции 0.012 делает алгоритм поиска чувствительным к воздействию помех — нахождению зон без объекта хорошо коррелируемых с эталонным объектом…

Улучшение отношения сигнал/шум корреляции увеличением отношения площади символа к площади обнаружения символа
Способность различать символы корреляционным методом зависит от разрешения поля символа, отношения площади символа к площади обнаружения символа и расхождением между определяемым и эталонными символами. Корреляция увеличивается с увеличением разрешения и отношения площадей и уменьшением расхождений между сравниваемыми символами.

Рис. 32. Выделение зон расположения символов.

Рис. 33. Коэффициент корреляции между цифрами объекта 5 (синяя линия), 6 (коричневая линия) и 2 (желтая линия) в зоне 17x25 пикселей и эталонными символами: пустая зона, символы от 0 до 9. По амплитуде корреляции видно, что двойка хорошо отличается от остальных символов (её легче обнаружить), а пятерка мало отличается от шестерки.

Рис. 34. Коэффициенты корреляции между двумя пустыми зонами объекта и зоной с 9 и эталонными символами «пусто»; 0; 1; 2; 3; 4; 5; 6; 7; 8; 9. Графики показывают максимальную корреляцию с «пустым» эталонным символом для первых двух позиций и с эталоном 9 — для последней позиции.

Устранение неопределенности при сравнении символа с пустой зоной
Корреляционная функция может давать неопределенное значение NaN при сравнении символа объекта с пустой эталонной зоной состоящей из нулей. Для устранения такого эффекта интенсивность одного элемента эталона увеличена до 255:

function nmb = recognize_1(Img,target_area,Img_ref,index)
nmb = 0;
for n = index(1):index(end)
Img_target = imcrop(Img,target_area(n,:));
Img_target = imadjust(Img_target); % Adjust image intensity values
Img_target(1,1) = 255; % to remove NaN correlation with zero image

for i = 1:size(Img_ref,1)
Img_ref(i,1,1) = 255; % to remove NaN correlation with zero image
Img_reference = reshape(Img_ref(i,:,:),size(Img_ref,2),size(Img_ref,3));
r(i) = corr2(logical(Img_reference-110),logical(Img_target-110));
end
num = find(r == max®) — 2;
if num < 0
num = 0;
end
nmb = nmb*10 + num;
end

Увеличение корреляции использованием типовых шрифтов
В рассматриваемом варианте 320 x 240 пикселей используются шрифты цифр следующих размеров 18; 26; 36 и 60. Подобрать и доработать шрифт эталона к шрифту объекта можно при помощи специальных программ, например, GLCDFontCreator.exe [5].

Рис. 35. Оригинальное изображение (слева) и результат наложения 'Arial Rounded MT Bold' шрифтов на оригинальное изображение (справа).

Рис. 36. Вариант сужения зон поиска символов.

Рис. 37. Варианты эталонных цифр высокого и низкого разрешения. Корреляция (совпадение) между цифрами 5 и 6 выше чем между остальными символами.

Рис. 38. Пиксельный вид надписей Time и Stop

GUI
Система распознавания состояния объекта дополнена Графическим Интерфейсом Пользователя (GUI). Интерфейс пользователя разработан в МатЛАБ. Интерфейс имеет следующие особенности.
• управляет настройкой и запуском видео
• выводит видео в реальном времени
• показывает качество установки видеокамеры относительно объекта
• подстраивает положение зон распознавания
• показывает результат распознавания символов
• восстанавливает по символам величины параметров
• строит графики изменения параметров объекта
• накапливает и сохраняет результаты
• принимает воздействие пользователя на объект через кнопки NEXT и SELECT

Рис. 39. Начальное состояние Графического Интерфейса Пользователя (GUI) спроектированного в МатЛАБ.

Рис. 40. Фрагмент GUI. Видеоизображение объекта частотой 30 Гц выводится слева. Распознанные в выделенных зеленых зонах символы видеопотока отображаются на шаблоне кадра справа. Точность совмещения камеры и объекта определяется положением рамки самой большой прямоугольной зоны левого кадра.

РЕЗУЛЬТАТ РАСПОЗНАВАНИЯ СИМВОЛОВ ОБЪЕКТА

Рис. 41. Состояние GUI при начальном формате вывода данных объекта.

Рис. 42. Состояние GUI при измененном формате вывода данных объекта.

Рис. 43. Графики выводимых на дисплей объекта параметров, считанных бесконтактной системой распознавания символов.

Литература
1. BIO-350 Dive Computer ttps://www.opensafety.eu/datasheets/Bio350%20Short%20Datasheet.pdf
2. Портативная веб-камера HD Webcam C525 www.logitech.com/ru-ru/product/hd-webcam-c525.
3. Help MatLAB > Computer Vision System Toolbox > Examples > Automatically Detect and Recognize Text in Natural Images.
4. Help MatLAB > Object Detection and Recognition > Examples and How To > Pattern Matching.
5. Dr. Bob Davidov. Построение интерфейса пользователя локальной системы управления на базе контроллера Arduino UNO. portalnp.ru/wp-content/uploads/2015/01/15.03_Arduino-UNO-Local-Control-User-Interface_Ed2a.pdf
6. Dr. Bob Davidov. Компьютерные технологии управления в технических системах portalnp.ru/author/bobdavidov.
Поделиться с друзьями
-->

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


  1. lzb_j77
    07.06.2016 09:23

    Спасибо, полезная штука — можно ещё снимать показания со счётчиков энергии и сразу заносить их в базу :)


    1. Evgenym
      07.06.2016 10:41
      -1

      Был такой пост: https://habrahabr.ru/post/220869/


  1. sergehog
    07.06.2016 11:37

    Похоже я пропустил объявление об открытии «недели курсовиков и лабораторок на Хабре»


  1. Gryphon88
    07.06.2016 13:56
    +2

    Очень, очень плохо.
    1. Плохо написано с точки зрения текста.
    Научная работа — это логически непротиворечивый и последовательный текст. Разделы и абзацы должны логически вытекать друг из друга. В тексте должны присутствовать завязка, кульминация и развязка, желательно (но не обязательно для научпопа) ещё перечисление действующих лиц и моралитэ. Для статей они называются соответственно introduction, results и conclusion, опциональные — materials@methods и discussion. По Вашему вступлению я не понял, о чем вообще работа и зачем она была проделана, ну и кондовый канцелярит. Потом описание встроенных функций матлаб, на 1-2 строчки, без объяснения, при чём тут они. Потом материалы и методы, и ещё раз, вдобивочку, повторение функций. И примеры в конце. Состыкуйте всё это в текст.
    2. Новизна?
    Примерно всё то же самое писали в Digital image processing using MATLAB (Гонзалес, Эддингс, Вудс) и Журавель (см. материалы на matlab.exponenta.ru). Не менее 10 лет назад, на секундочку. Эддингс вежливый, он тоже не претендовал на новизну и давал ссылки на работы конца 80х.
    3. MatLAB
    Пишется MATLAB. Я не знаю, у кого в компании MathWorks в 84м был маленький член, но все буквы в названии заглавные и английские. Ладно, хотите использовать своё написание — в путь. Но одно какое-нибудь выберите, а не все 4, встречающиеся в тексте.
    4. Code
    Оформляйте код с помощью тега code, тогда там будут псевдоцвета и форматирование. Не гоняйте циклы в MATLAB, используйте логическое индексирование, (cell/struct/array)fun и bsxfun. Так правда значительно быстрее работает, а по памяти MATLAB уже давно не выбивает.
    5. Список литературы
    Нерецензируемые источники, дублирующиеся ссылки, косые ссылки… Весь набор. Ребята из MATLAB вежливые, они часто пишут в конце хелповой статьи ссылки на литературу. Хелпы бывают трех типов, в максимальной расширенном или в аппноуте ссылка на статью/книгу обычно есть.