Серия проектов "Дополнение к реальности "

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Серия проектов "Дополнение к реальности "

Сообщение Alex2013 » 23.05.2015 17:56:18

И так надумал я заняться перспективными разработками ( Ну как для меня ленивого так точно прогресс ...)

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

Что уже сделал :
Более-менее разобрался с выделением замкнутых контуров
(Метод не самый быстрый но работает даже с вложенными в несколько уровней "лабиринтами" ... Нужно только доделать захват без лишнего "шума" ) Так же присутствуют попытки распознавания образов ...
Оптимизации пока мягко говоря не густо но это вообще-то "лабораторное чучело", а не действующий прототип ..
(Сглаживание пока вообще во внешнем модуле )
:arrow: RG.zip
Инструкция :
После распаковки архива в отдельной папке запускаем RG_001.exe.

1 Загружаем картинку
2 Настраиваем параметры (необязательно )
( По умолчанию стадии обработки дальше 5-го этапа работают с первым(точнее с "нулевым" - извиняюсь где-то лениво было единицу прибавить ... :oops: !) найденным контуром но можно поменять )
3 Выбираем изображение "маски"-эталона (должно быть ЧБ без градаций желательно вообще "однобитный" BMP )
4 Давим кнопку "Auto" наблюдаем процесс и "лог" операций (или последовательно запускаем этапы (кнопку "Этап 4 вариант 2" лучше не нажимать бо недоделка ) )
Вообще-то можно пытаться "распознавать" что угодно хоть буквы и цифры хоть чью-то подпись ...
----------------------------------------------------------------
(С загруженным изображением, параметрами по умолчанию и введенным именем файла маски можно посмотреть как "должно быть"..
Увы! Пока во многом это просто показуха ... Хотя алгоритм реально трудится . )

Исходник прилагаются ....

Вообщем "Дали буде!" (Продолжение следует)
Надувается от гордости пока причин нет но "процесс пошел".... :wink:
"Анонс !"
На той неделе думаю сделать нечто еще более прогрессивное с обработкой реальных кадров от веб камеры ...
и с возможностью брать "крученные подачи" (Попытаюсь распознавать изображения повернутые на любой угол ...)
Зы
Буду рад отзывам и советам
Последний раз редактировалось Alex2013 11.06.2015 17:03:30, всего редактировалось 2 раз(а).
Alex2013
энтузиаст
 
Сообщения: 697
Зарегистрирован: 03.04.2013 11:59:44

Re: Серия проектов "Дополнение к реальности "

Сообщение скалогрыз » 24.05.2015 09:22:32

Alex2013 писал(а):Инструкция :
После распаковки архива в отдельной папке запускаем RG_001.exe.

мой единственынй совет - создать проект на любом хостинге проектов.
Там и доступ будет публичный всем в любой момент суток, ну и документацию с баг треккером можнно вести.
скалогрыз
долгожитель
 
Сообщения: 1645
Зарегистрирован: 03.09.2008 02:36:48

Re: Серия проектов "Дополнение к реальности "

Сообщение Alex2013 » 24.05.2015 11:57:46

Идея не плохая однако пока проект не в том состоянии что-бы его дальше форума постит ... Это пока скорее "исследования на тему" .... Но по себе знаю что иногда даже подобные попытки могут быть очень полезны если выкладываются с "живыми исходниками" . Часто даже "по шагам разжеванные статьи" по алгоритмам с примерами сдержат кучу ошибок (буквально только что сталкивался )... А тут рабочий код ...

ЗЫ
Да использую Лазарус версии 1.2.6 + дополнительный код для сглаживания "на рисован" в хайасме (HiAsm_4.04b185.20-01-11_AltBuild_v814.01 ) для исследований скорость обработки пока не особо важна, а вот возможность быстро применить готовый метод обработки изображения очень полезна ...

Зы Зы
В перспективе задумал
1 Распознание маркеров и их положения в пространстве .
2 Распознание рабочего поля ограниченного маркерами
3 Создание программы "Бумажная клавиатура" и вообще распознавание нажатий на разные виртуальные кнопки в стиле "дополнения к реальности" ( Например нарисованных эквалайзеров, клавиш синтезатора или разных управляющих приборов в симуляторах )
Зы Зы Зы
Есть вопрос как можно быстро отслеживать ситуации в стиле"СОВСЕМ НЕ ПОХОЖЕ" ? (на подобие того как у меня отслеживаться ситуация "чёрный контур")
Последний раз редактировалось Alex2013 26.06.2015 23:52:21, всего редактировалось 1 раз.
Alex2013
энтузиаст
 
Сообщения: 697
Зарегистрирован: 03.04.2013 11:59:44

Re: Серия проектов "Дополнение к реальности "

Сообщение Pavia » 24.05.2015 18:39:48

Давайте знакомится. Гуру программирования 90 левел. Чем цифра больше тем круче.

Есть вопрос как можно быстро отслеживать ситуации в стиле"СОВСЕМ НЕ ПОХОЖЕ" ? (на подобие того как у меня отслеживаться ситуация "чёрный контур")

Цвет, форма, размер, положение. Отсекаем по порогу.

Как правило основная отсечение делается на основе выделения примитивов.
К примитивам относятся границы(edge), кляксы (Blobs), углы (corne), квадраты Хаара (Haar-like rectangle
features), ещё круги(circle).

Более сложная технология каскады. А также метод главных компонент.
Аватара пользователя
Pavia
постоялец
 
Сообщения: 172
Зарегистрирован: 07.01.2011 12:46:51

Re: Серия проектов "Дополнение к реальности "

Сообщение stanilar » 24.05.2015 19:08:04

Alex2013 писал(а):проект не в том состоянии что-бы его дальше форума постит


А гитхаб и SF используют именно для домашних проектов. Иногда - для публикации кода для общественности.

Думаете если Вы запостите туда свое исследование, на него сразу сбегутся все гуру программирования и начнут оценивать что и как надо правильно писать?
stanilar
постоялец
 
Сообщения: 271
Зарегистрирован: 09.03.2010 19:09:02

Re: Серия проектов "Дополнение к реальности "

Сообщение Alex2013 » 25.05.2015 04:37:51

Сбегутся ... :) Не думаю ... Но и тут пока вроде не разбегаются ...
Pavia спасибо посмотрю ...
ЗЫ
Насчет своего "леввела" хорошо если 20-й сохранился ... но есть шансы возобновить практику ... :roll:
Вот стажа чуток уже есть даже тут уже отмечался (Несколько проектов отложены на "переосмысление")
Зы Зы
Что добавил в "распознавание" вычисление "уровня шума " совпадением точек многого разумеется не добиться ..
Код: Выделить всё
// Этап 7 Сравнение
procedure TFm1.Button10Click(Sender: TObject);
Var Max,X,Y,w,h,c0,C,c1,c2,C3,C4,CC:Integer;
B,b1,B2:TBitMap;
begin
if StrToInt(Edit3.Text) > CB-1 then exit;

W:=Imag1.Picture.Width;
H:=Imag1.Picture.Height;

B:=Image3.Picture.Bitmap;  //  Контур - Маска
B1:=Image5.Picture.Bitmap; //  Маска
B2:=Image4.Picture.Bitmap; //  Контур

C0:=0; // B2 -> Точки контура
C:=0;  // B -> Точки  (Контур - Маска)
C1:=0; // B1 Точки  Маски
C2:=0; // Общие точки  Маски и (Контур - Маска)
C3:=0; // Шум вне маски ...
C4:=00; // Количество точек вне маски (Max Шум);
CC:=00;
Max:=b2.Width * b2.Height ;
B2.Canvas.pen.Color:=clWhite;
B2.Canvas.Frame(Image3.Picture.Bitmap.Canvas.ClipRect);

for X :=0 to w-1 do
for Y :=0 to H-1  do begin

// B2 -> C0 КТК
if B2.Canvas.Pixels[X,Y] = clBlack then  Inc(c0,1);

// B -> C KТ(K-M)
if B.Canvas.Pixels[X,Y]  = clBlack then  Inc(C,1);

// (B1=B2 ) OT
if (B1.Canvas.Pixels[X,Y]= clBlack)AND (B.Canvas.Pixels[X,Y]= clBlack) then  Inc(C2,1);

// B1->C1 КТМ
if B1.Canvas.Pixels[X,Y] = clBlack then   inc(C1,1)
  else Begin
    B1.Canvas.Pixels[X,Y]:=ClRed;
    B1.Canvas.Refresh; // проверка по точкам проходит нормально .... 
    Inc(CC); // Но вот что  СТРАННО! счетчик выдает дикие значения например невозможные ~52тысячи (!)  из всего 1600 возможных
         // In (Not B1) B2 - > C3 Шум
        if B2.Canvas.Pixels[X,Y] = clBlack then inc (C3,1);
     end;
  end;
//  C4 Max Шум
C4:=Max-C1; // Разумеется так проще и надежней

ListBox1.Items.Add('C0 Точки контура :'+IntToStr(C0));
ListBox1.Items.Add('C Точки  (Контур - Маска) :'+IntToStr(C));
ListBox1.Items.Add('C1 Точки  Маски :'+IntToStr(C1));
ListBox1.Items.Add('C2 Общие точки  '+IntToStr(C2));
ListBox1.Items.Add('C3 Шум вне маски ...'+IntToStr(C3));
ListBox1.Items.Add('C4 Количество точек вне маски '+IntToStr(C4)+' '+IntToStr(CC));
ListBox1.Items.Add(' Мах '+IntToStr(Max));
ListBox1.Items.Add('B1.Width '+IntToStr(B1.Width));
ListBox1.Items.Add('B1.Height '+IntToStr(B1.Height));

if (c0 *100 ) div Max > 60 then    Label3.Caption:= 'Найден черный контур' else
   Label3.Caption:= format('КТK :%d КТKM :%d, КТM :%d ,Уровень шума : %f %%, Общие точки :%d Совпадене %f %%',
           [c0,C,C1,(C3*100) / c4  ,c2, C2*100 /c1 ]) ;

end;

Зы Зы
Обнаружил странный глюк CC и C4 вроде одно и тоже но почему получаемое через счетчик СС зашкаливает ?
Последний раз редактировалось Alex2013 09.06.2015 14:50:21, всего редактировалось 1 раз.
Alex2013
энтузиаст
 
Сообщения: 697
Зарегистрирован: 03.04.2013 11:59:44

Re: Серия проектов "Дополнение к реальности "

Сообщение Alex2013 » 27.05.2015 16:25:13

И так мал золотник да... протекает ! :)

Добавил примитивнейший механизм принятия решений ...
Код: Выделить всё
R1:=(C3*100) / c4; //Уровень шума в %
r2:=(C2*100) /c1 ; // Совпадене  в %
if (R1< 25) AND (R2> 70) then Begin
      label4.Font.Color:=clRed;
      label4.Caption:='Похоже !';end
else begin
      label4.Caption:='Не похоже !';
      label4.Font.Color:=clBlue;
     end;

И немного удобств в интерфейс ...
:arrow: RG2.ZIP
Работает на удивление четко .
(Так или иначе выловил или отбросил (Причем верно!) все что я скормил программе ...)
Наверное получилось бы сделать на основе софтины простейший распознаватель "квадратных капчь" или даже что-то типа самодельного файнРидера и опознания пользователя по подписи ...
Alex2013
энтузиаст
 
Сообщения: 697
Зарегистрирован: 03.04.2013 11:59:44

Re: Серия проектов "Дополнение к реальности "

Сообщение PapaNT » 27.05.2015 18:00:16

Я бы дальше попробовал бы распознавать "траектории" (по единичным опознанным точкам можно с некоторой долей вероятности строить предположение о наличии связи.
Конечное распознавание объектов класса черное/белое можно дополнить предварительным алгоритмом фильтрации входного потока. Например, когда на статичном фоне появляется объект. Далее уже можно пробовать привести объект к каким-либо фильтрам описанным у вас.

P.S.: Графическими распознавалками не занимался, но раньше изучал обработку целевой обстановки в космосе (в условиях активных и пассивных помех). Возможно, кое-что из моих знаний могло бы пригодиться.
PapaNT
постоялец
 
Сообщения: 162
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

Re: Серия проектов "Дополнение к реальности "

Сообщение Alex2013 » 28.05.2015 22:50:10

Вообще-то пока пытаюсь разбрататься с "повернутым изображением " и так далеко не заглядываю .
В общем в ближайших планах
1 Распознавание повернутого изображения
2 + изображения "со сдвигом"
(По идее сдвиг и поворот перекрывают любые потребности )
3 Перейти на реальные изображения от вебкамеры ...
4 Попробовать работать с видео потоком .
..
ЗЫ
Беда в том что моих знаний по теме пока не хватит даже на "правильные вопросы"...
Но я уже не раз брался за разные проекты будучи знаком с их основой на уровне "банальной эрудиции" так что "где наша не пропадала? - и тут не пропадала и там не пропадала!" :wink:
Вопрос только в терпении и отсутствии "горящих проектов" .
В общий принцип сделать что-то "условно рабочие" что-бы хотя-бы попробовать проблему "на зуб"
(И довольно часто выяснялось, что трудности (хотя бы рамках поставленных задач) сильно преувеличены )
Alex2013
энтузиаст
 
Сообщения: 697
Зарегистрирован: 03.04.2013 11:59:44

Re: Серия проектов "Дополнение к реальности "

Сообщение Pavia » 29.05.2015 09:49:57

Alex2013 писал(а):Но я уже не раз брался за разные проекты будучи знаком с их основой на уровне "банальной эрудиции" так что "где наша не пропадала? - и тут не пропадала и там не пропадала!"

Видишь, там на горе возвышается крест, Под ним десяток солдат, повиси-ка на нём. А когда надоест, возвращайся назад Гулять по воде, гулять по воде, Гулять по воде со мной. :wink:
Аватара пользователя
Pavia
постоялец
 
Сообщения: 172
Зарегистрирован: 07.01.2011 12:46:51

Re: Серия проектов "Дополнение к реальности "

Сообщение Alex2013 » 30.05.2015 00:44:26

Ну у меня обычно другой случай ... :wink:
Я нес в ладонях чудесную воду. Она была чиста и прохладна.
Я так торопился успеть к восходу. Но я не донес, я все выпил до дна.
Поверь, вреда, поверь, вреда, поверь вреда я не принес.
Ведь все, что нес, я не донес. Значит я ничего не принес.
Ты нес в народ смятенье и правду, и вера твоя уже теплилась в нас.
Ты шел, как стоял, сквозь высокие травы, и ты не донес, ты всю праду растряс.
Заметь, вреда, заметь, вреда, заметь, вреда ты не принес.
Ведь все, что нес, ты не донес. Значит ты ничего не принес.
Нести ничего не стоит так сложно, тем более, если нести далеко.
И смысл в том, что нести что-то можно до тех пор пока не сбежит молоко.
Поверь, никто, никогда, ни за что не принес сюда никакого вреда.
Ведь все, кто нес, никто не донес. Значит никто ничего не принес.
Все, кто нес, никто не донес. Значит никто ничего не принес.
:mrgreen: :idea:

Кресты не для звезд !
И даже тех кто проштемпелеван
их тенью тянет к свету
назло их лени ...

Пар сожаления эхо снов ..
- Не потревожу я нигде основ !
Но все-же верю не напрасно
я строить странную страну
что выкрашена в красный
пугающий но все-ж прекрасный
пытаться буду !

Добавлено спустя 16 часов 40 минут 6 секунд:
Но вернусь к своему барану... :wink:
Обнаружил оригинальной способ поворота картинки ....
(В отличии от того что в примерах работает без "дыр" и довольно быстро ...)

Код: Выделить всё
// требует подключения модуля  Math
  bmp.Assign( Imag1.Picture.Bitmap);
  xo := bmp.Width div 2; yo := bmp.Height div 2;
  bmp1 := Graphics.TBitmap.Create;
  bmp1.Width := bmp.Width;  bmp1.Height := bmp.Height;
  bmp1.Canvas.Brush.Color := clWhite;  bmp1.Canvas.Pen.Color := clWhite;;
  bmp1.Canvas.FillRect(0, 0, bmp1.Width,bmp1.Height);

// U -угол поворота в градусах ..

  a := U*Pi/180;
    for y := 0 to bmp.Height - 1 do
    begin
      for x := 0 to bmp.Width - 1 do
      begin
// проверку границ добавил от себя  но код работает и так
// "Поворот в  три строчки "
        r := sqrt(sqr(x - xo) + sqr(y - yo));//1
        SinCos(a + arctan2((y - yo), (x - xo)), s, c); //2
        RX:=round(xo + r * c);RY :=round(yo + r * s);//3
         if  (RX in [0..bmp1.Width-1]) and (RY in [0.. bmp1.Height-1])  then
         bmp1.Canvas.Pixels[x,y] := bmp.Canvas.Pixels[RX,RY];
      end;
      Application.ProcessMessages;
    end;
    Imag1.Picture.Bitmap.Assign( bmp1);
Alex2013
энтузиаст
 
Сообщения: 697
Зарегистрирован: 03.04.2013 11:59:44

Re: Серия проектов "Дополнение к реальности "

Сообщение Alex2013 » 07.06.2015 01:16:13

И так продолжение банкета!

1 Немало общих улучшений ( можно настраивать чувствительность и уровень шума )
2 Сделал более или менее нормальное вычисление размера и смещения повернутой картинки ...
(Правда при повороте от 0 до 90 градусов но при реальном использовании этого хватит )
3 В ручном режиме(при повороте всей картинки) поворот работает нормально в «полуавтоматическом» режиме при повороте блока пока есть сбои ...
4 Заменил поворот блока на поворот маски .
( метод работает но достоверность меньше (Уменьшение процента совпадения до 50% не есть гуд )
--------------------------------------------------------------------------------------------------------------------------------------------------
:arrow: RG3.zip
В readme.txt есть описание тестовых примеров ....
Alex2013
энтузиаст
 
Сообщения: 697
Зарегистрирован: 03.04.2013 11:59:44

Re: Серия проектов "Дополнение к реальности "

Сообщение Alex2013 » 09.06.2015 15:06:52

Между делом ....
Интересно почему в LCL не работает вот это способ поворота картинки ?
( FPC не причём метод отлично работает с КОЛ откуда по сути и выдран...
может где-то просто прокрался ляп ?
Метод интересен тем что позволяет не только вращать но и другие искажения метрики воспроизводить )
Код: Выделить всё
{$SMARTLINK ON}
const
{ Graphics Modes }
  GM_COMPATIBLE = 1;
  GM_ADVANCED = 2;
  GM_LAST = 2;
  { xform stuff }
  MWT_IDENTITY = 1;
  MWT_LEFTMULTIPLY = 2;
  MWT_RIGHTMULTIPLY = 3;

  MWT_MIN = MWT_IDENTITY;
  MWT_MAX = MWT_RIGHTMULTIPLY;

  msimg32lib = 'msimg32.dll';
  user32lib = 'user32.dll';
  shell32lib = 'shell32.dll';
  gdi32lib = 'gdi32.dll';
  comctl32lib = 'comctl32.dll';

type
  PXForm = ^TXForm;
  tagXFORM = packed record
    eM11: Single;
    eM12: Single;
    eM21: Single;
    eM22: Single;
    eDx: Single;
    eDy: Single;
  end;

  TXForm = tagXFORM;
  XFORM = tagXFORM;
function SetGraphicsMode(hdc: HDC; iMode: Integer): Integer;stdcall;
         external gdi32lib name 'SetGraphicsMode';
//function GetWorldTransform(DC: HDC; var p2: TXForm): BOOL; stdcall;
external gdi32lib name 'SetWorldTransform';
function SetWorldTransform(DC: HDC; const p2: TXForm): BOOL; stdcall;
external gdi32lib name 'SetWorldTransform';
function ModifyWorldTransform(DC: HDC; const p2: TXForm; p3: DWORD): BOOL; stdcall;
   external gdi32lib name 'ModifyWorldTransform';


procedure DrawRotatedBitmap(Bitmap: TBitmap; Dest: TCanvas; X, Y: Integer;
     Angle: Single);
   var
     Matrix: TXForm;
   begin
     // Разрешаем афинные преобразования
     SetGraphicsMode(Dest.Handle, GM_ADVANCED);
     // Устанавливаем матрицу для смещения на (X, Y)
     Matrix.eM11 := 1;
     Matrix.eM12 := 0;
     Matrix.eM21 := 0;
     Matrix.eM22 := 1;
     Matrix.eDx := X;
     Matrix.eDy := Y;
     SetWorldTransform(Dest.Handle, Matrix);
     // Устанавливаем матрицу поворота
     Matrix.eM11 := Cos(Angle);
     Matrix.eM12 := Sin(Angle);
     Matrix.eM21 := -Sin(Angle);
     Matrix.eM22 := Cos(Angle);
     Matrix.eDx := 0;
     Matrix.eDy := 0;
     ModifyWorldTransform(Dest.Handle, Matrix, MWT_LEFTMULTIPLY);
     // Выводим изображение
     Dest.Draw(0, 0, Bitmap);
     // Восстанавливаем систему координат
     ModifyWorldTransform(Dest.Handle, Matrix, MWT_IDENTITY);
   end;

Код компилируется и выполнятся но результат "белый квадрат Малевича "
Зы
Мда ... что-я с вращением "забурился" нужно дальше продвигаться ..
Последний раз редактировалось Alex2013 11.06.2015 16:14:27, всего редактировалось 1 раз.
Alex2013
энтузиаст
 
Сообщения: 697
Зарегистрирован: 03.04.2013 11:59:44

Re: Серия проектов "Дополнение к реальности "

Сообщение Alex2013 » 11.06.2015 16:09:23

:arrow: RG3_1.ZIP
Добавил возможность распознавания при условно произвольном угле поворота ( на самом деле пока от 0 до 90).
(Угол теперь можно задавать в виде диапазона (например 10-45) с заданным шагом .)
Исправил кучу ошибок (даже чуть больше чем сделал на этот раз ) :wink:
Изображение
Последний раз редактировалось Alex2013 18.06.2015 21:32:42, всего редактировалось 3 раз(а).
Alex2013
энтузиаст
 
Сообщения: 697
Зарегистрирован: 03.04.2013 11:59:44

Re: Серия проектов "Дополнение к реальности "

Сообщение Alex2013 » 16.06.2015 21:15:00

Как говорят авиадиспетчеры начал было "терять картинку" ... Громадъё "исправлений поверх исправлений" начало туманить по идее простой алгоритм . :cry:
В общем как сказал кто-то умный "Сложность программы растет до тех пор, пока не превысит способности программиста." :idea:

Но у меня есть проверенное средство ! :arrow: Выделить функции которые "упираются" в отдельный субпроект и отладить их отдельно
(Желательно так-же переписать сопутствующий код-интерфейса чтобы исключить нагромождение ошибок )
Короче решили "пойти конем" и выделил функции распознавания по готовым контурам в отдельный EXE.

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

Но скорее всего уже завтра "догоню и перегоню свою тень" !
Alex2013
энтузиаст
 
Сообщения: 697
Зарегистрирован: 03.04.2013 11:59:44

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru
cron