Разработка распознавание изображения (видеозрение)

На данный момент я веду активную разработку библиотеки для delphi7. В этой библиотеке будут (уже есть) типичные функции обработки видеопотока, такие как регулировка контраста, яркости и т.д.. Помимо этого, планируется включить туда элементы распознавания. Надеюсь, скоро здесь выложу исходный код с подробным описанием библиотеки.

Пока поддерживается разрешение камеры 640*480.

Уже есть функция получения кадра из камеры, регулировка контраста, яркости, размытие, выделения границ объектов на картинке и вывод изображения в стандартный компонент TImage.

Но для работы в режиме реального времени необходимо высокое быстродействие. Обработка пикселей картинки в компоненте TImage происходит очень медленно, поэтому картинка храниться в одномерном массиве. Это позволяет быстро производить однотипные операции с пикселями, такие как контраст и яркость картинки.

Тип для хранения кадра из камеры назван TFrame. И это указатель на массив байтов:

type

mas=array of Byte;
TFrame=^mas;

Часто приходиться сохранять кадры. Поэтому в наличии имеется функция копирования кадра:

function CopyFrame (Source:TFrame):TFrame;
begin
New(Result);
SetLength(Result^, FrameSize);
CopyMemory(@Result^[0], @Source^[0], FrameSize);
end;

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

Данная функция передает ссылку на область памяти, где храниться скопированный кадр.

Для нахождения различий между двумя кадрами имеется следующая функция:

function DifferenceFrame(frame1, frame2:TFrame):TFrame;
var i:Integer;
b:Integer;
begin
New(result);
SetLength(result^, FrameSize);
for i:=0 to FrameSize-1 do begin
Result^[i]:=Abs(Frame1^[i]-Frame2^[i]);
end;
end;

Здесь над кадрами работают как с одномерными массивами. Это быстрее, чем если бы их сравнивали как двумерные массивы. Результат выполнения данной функции — ссылка на кадр, содержащий разницу двух заданных кадров.

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

function GetPixel(tmp:TFrame; i,j:Integer):TRGB;
procedure PutPixel(tmp:TFrame; i,j:Integer; color:TRGB);

Первая функция из указанного кадра достает пиксел i-го столбца и j-й строки. Вторая функция наоборот записывает пиксель в i-й столбец и j-ой строки.

Ниже представлена реализация функции PutPixel. Аналогично работает и GetPixel.

procedure PutPixel(tmp:TFrame; i,j:Integer; color:TRGB);
var index:integer;
begin
if tmp=nil then exit;
if not ((i>=0)and(i<640)and(j>=0)and(j<480)) then exit;
index:=(i+(479-j)*640)*3;
tmp^[index+2]:=color.r;
tmp^[index+1]:=color.g;
tmp^[index]:=color.b;
end;

В итоге, на данный момент реализованы следующие функции:

function init:Boolean;
function CaptureToImage(image:TImage): HResult;
function GetPixel(tmp:TFrame; i,j:Integer):TRGB;
procedure PutPixel(tmp:TFrame; i,j:Integer; color:TRGB);
function CaptureToFrame(var frame:TFrame): HResult;
function FrameRefresh(frame:TFrame): HResult;
function TRGBToTColor(RGB:TRGB):TColor;
function TColorToTRGB(Color:TColor):TRGB;
Procedure ShowConfig(Handle:THandle);
procedure FrameToImage(frame:TFrame; image:TImage);
procedure blur(tmp:TFrame; k:real);//Смазывание картинки k — Коэффициент смазывания (0 до 1)
function CopyFrame (Source:TFrame):TFrame;
function DifferenceFrame(frame1, frame2:TFrame):TFrame;
function GetBorders(tmp:TFrame; k:Real):TFrame;
procedure contrast(frame:TFrame; value:Real);
procedure brightness(frame:TFrame; value:Integer);
function ConvertToChB(tmp:TFrame; k:Integer):TFrame;
procedure ConvertToChB2(tmp:TFrame);
procedure DestroyFrame(frame:TFrame);
procedure line(frame:TFrame; x1,y1,x2,y2:integer; w:word; color:TRGB);

Дорабатываются следующие функции:

function TRGBToTHSV(color:TRGB):THSV;
function THSVToTRGB(color:THSV):TRGB;

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

Зеленым отображается то, что программа распознала в кадре. А присвоенная ему строка находится в заголовке окна.

На данный момент работаю над улучшением распознавания простых фигур. Обо всех продвижениях буду писать в следующих записях.

Разработка распознавание изображения (видеозрение): 2 комментария

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

  2. Да, согласен. Иногда нужно бывает изображение преобразовать в оттенки серого. Поэтому, функция которое это делает, имеется в библиотеке. Однако я пока пишу распознавание по границам. Но для нахождения границ цвета не мешают. А терять информацию о цвете мне не хочется, так как цвет несет дополнительную информацию об объекте в кадре. В конце концов можно будет копировать кадр, затем преобразовать в оттенки серого. В оттенках серого распознать объект, а в цветной копии достать информацию о цвете.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *