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

Поддерживаемые форматы входных файлов BMP, CUR, GIF, HDF4, ICO, LPEG, JPEG 2000, PBM, PCX, PGM.
Добавление графического примитива к изображению
Imf = insertShape(pct, 'Rectangle', [32, 27, 220, 153], 'Color', 'green'); % к исходной картинке pct добавлена прямоугольная рамка зеленого цвета.

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

Уменьшение изображения
Уменьшение изображения в 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');

Изменение размера изображения
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 >

Фильтрация изображения
2d медианная фильтрация изображений в полутонах серого для устранения шума.
pct_filt=medfilt2(pct_bw,[3 3]); % Медианный фильтр для устранения шума.
Создание и применение других 2d фильтров:
h = fspecial(type); % Создание фильтра. type - тип фильтра: 'average' (сглаживающий), 'disk' (круговой сглаживающий ), 'gaussian' (Гауссовский), 'laplacian' (Лапласа), 'log' (Лапласа Гаусса), 'motion' (сглаживает воздействие линейного движения камеры), 'prewitt' и 'sobel' (выделение кромок)
pic_filt = imfilter(pct_bw,h); % Применение фильтра h к изображению pct_bw
Размытие изображения
se=strel('disk',6); % Создание морфологического структурного элемента (STREL)- массив 0 и 1 с расположением единиц в виде круга, эллипса, квадрата
pct_dilasi=imdilate(pct_filt,se); % Размытие изображения

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

Вычитание константы из изображения или другого изображения
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);

Конвертирование матрицы в изображение серых тонов
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 изображенияimage f

Растягивание интенсивности изображения
При отсутствии параметров интенсивность растягивается так, чтобы ее минимальное и максимальное значение были 0 и 255 соответственно.
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

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

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

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

Код программы:
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 – количество найденных островков.

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


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

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


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

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


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

Основные требования к компьютеру при разрешении камеры 1280 х 720 точек.
- Частота процессора 2.4 GHz
- Объем ОЗУ 2 GB
- Свободное пространство на жестком диске 200 MB
- USB порт 2.0
- Операционная среда: Windows XP (SP2 or higher), Vista или Windows 7 (32-bit или 64-bit)
Подключение видеокамеры к МатЛАБ
1. Проверьте входит ли видиокамера в список устройств МатЛАБ.
>> webcamlist
2. Если камеры нет в списке, подключите её, используя пакет Support Package Installer (см. Рис. 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)

4. Установка требуемых параметров камеры.
cam = webcam (1)
Примеры структурного списка параметров камеры:

Получение возможных значений параметров, например, разрешения камеры
>> 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'

Установка требуемого значения параметра
>> cam.Resolution = '320x240';
5. Выход из режима просмотра видео.
>> closePreview(cam)
6. Ввод кадра.
>> img = snapshot(cam);
7. Отображение кадра.
>> imshow(img)
8. Удаление объекта камеры.
>> clear('cam');
Настройка положения камеры относительно объекта
К выводимому в МатЛАБ видео добавляется рамка с известными координатами (Рис. 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.

РАСПОЗНАВАНИЕ ТЕКСТА
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);

Таблица 1. Результат распознавания текста.

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

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


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


Устранение неопределенности при сравнении символа с пустой зоной
Корреляционная функция может давать неопределенное значение 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(r)) - 2;
if num < 0
num = 0;
end
nmb = nmb*10 + num;
end
Увеличение корреляции использованием типовых шрифтов
В рассматриваемом варианте 320 x 240 пикселей используются шрифты цифр следующих размеров 18; 26; 36 и 60. Подобрать и доработать шрифт эталона к шрифту объекта можно при помощи специальных программ, например, GLCDFontCreator.exe (•5).




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


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



Литература
1. BIO-350 Dive Computer https://www.opensafety.eu/datasheets/Bio350%20Short%20Datasheet.pdf
2. Портативная веб-камера HD Webcam C525 http://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. Построение интерфейса пользователя локальной системы управления на базе контроллера Arduino UNO. http://portalnp.ru/wp-content/uploads/2015/01/15.03_Arduino-UNO-Local-Control-User-Interface_Ed2a.pdf