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

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

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

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

Сообщение скалогрыз » 16.06.2015 22:06:57

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

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

Сообщение Alex2013 » 18.06.2015 00:14:41

В проект в том виде в котором он прибивает сейчас ? Не думаю вот чуть позже возможно ...
К тому-же есть особенности моих привычек : Я использую виндовс только в оффлайне, а там все основные инструменты да и привычней...
Перегружается в "боевой онлайн" слишком часто чуть муторно .

Возможно запущу одну из резервных железяк для сети (раннее думал сделать наоборот но слишком они уже не стабильны или стары) тогда возможно будет возможность легко и непринужденно поддерживать свой репозитарий или что-то вроде SVN...

Зы

Метод поворота через "искажение континуума" все-же работает ..


Код: Выделить всё
// не помню точно в каком модуле нужные типы 
uses
  Classes, SysUtils, FileUtil,  Forms, Controls, Graphics, Dialogs,
  ExtCtrls, Buttons, StdCtrls, Process, lazregions,
   LCLIntf, LCLType, IntfGraphics,Math;
...
{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 'GetWorldTransform';

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';

// Пересчет размера
// входящие ---------------------
// degree угол
// W,H ширина исходной картинки

/ /исходящие -------------------
// topoverh, leftoverh точка оси поворота ?(Не уверен в "физическом смысле" этих координат)
// X,Y - Ширина и высота "повернутой" картинки

Procedure GetRSize (degree,W,H: integer; Var topoverh, leftoverh,X,Y: integer);
Var
   cosA, sinA: real;

Begin
    cosA := cos(degree*Pi/180);
    sinA := sin(degree*Pi/180);
    while degree >= 360 do degree := degree - 360;
    while degree < 0 do degree := degree + 360;
    if (degree <= 90) then
      begin
        topoverh  := 0;
        y := Round(W * sinA + H * cosA);
        leftoverh := Round(- H * sinA);
        x := Round(W * cosA) + Abs(leftoverh);
      end
      else if (degree <= 180) then
      begin
        topoverh  := Round(H * cosA);
        y := Round(W * sinA) + Abs(topoverh);
        leftoverh := Round(W * cosA - H * sinA);
        x := Abs(leftoverh);
      end
      else if (degree <= 270) then
      begin
        topoverh  := Round(W * sinA + H * cosA);
        y := Abs(topoverh);
        leftoverh := Round(W * cosA);
        x := Round(- H * sinA) + Abs(leftoverh);
      end
      else
      begin
        topoverh  := Round(W * sinA);
        y := Round(H * cosA) + Abs(topoverh);
        leftoverh := 0;
        x := Round(W * cosA - H * sinA) + Abs(leftoverh);
      end;

end;

//Поворот картинки
procedure DrawRotatedBitmap(Bitmap: TBitmap; Dest: TCanvas; X_, Y_: Integer;
     degree,topoverh, leftoverh: Integer);
   var
     Matrix: TXForm;
       Angle: Double;
  x, y, H, W: integer;

   begin
      H := Bitmap.Height;
      W := Bitmap.Width;
      Angle:= degree*Pi/180;
    while degree >= 360 do degree := degree - 360;
    while degree < 0 do degree := degree + 360;

     // Разрешаем афинные преобразования
     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 := -leftoverh;
     Matrix.eDy := -topoverh;;
     ModifyWorldTransform(Dest.Handle, Matrix, MWT_LEFTMULTIPLY);
     // Выводим изображение
     Dest.Draw(0, 0, Bitmap);
     // Восстанавливаем систему координат
     ModifyWorldTransform(Dest.Handle, Matrix, MWT_IDENTITY);
   end;

Использовать так
Запустить GetRSize для пересчета
создать изменить размер и закрасить если надо исходящий битмап
и применить DrawRotatedBitmap для поворота
как-то так :idea:
Код: Выделить всё

GetRSize(i*10,40,40,tv,lv,wr,hr);
Br:=Tbitmap.Create; Br.SetSize(wr,hr);
  With  BR.Canvas do begin brush.Color:=clWhite;FillRect(ClipRect);end;
   DrawRotatedBitmap(B0,BR.Canvas,0,0,i*10,tv,lv);
  Image2.Picture.Bitmap.Assign(BR);
  Br.free;
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение Sharfik » 18.06.2015 03:28:49

Добавлю немного фантастики в тему, для размышления.
На днях читал статью по двухстороннюю связь через оптику не ослепляющих фар автомобиля. Суть в том, что на короткие промежутки времени(не видимые глазу) светодиоды в фарах авто потухают и работают на прием. Идея была сделать высокочастотные модуляторы связи там. Отсюда вопрос, если программа "Дополнения реальности" использует метки свои в виде линий каких то, то возможно ли сделать чтобы она считывала через веб камеру картинку и если на ней есть точка мерцающая с частотой определенной, то определяла ее как метку? Или частоты работы веб камеры будет не достаточно?

В фильме "Особое мнение" герой использует перчатки http://www.blowcreative.co.uk/uploads/n ... cruise.jpg, на каждой руке две точки светящиеся. В принципе четыре таких точки являются маркерами очень удобными, которые стабильно дают свое положение и на основе их перемещения можно сделать интерфейс управления тем же zcad, который делается в соседней теме. И выключить их для избежания ошибки ввода проще, нежели камера бы просто жесты читала.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 759
Зарегистрирован: 20.07.2013 01:04:30

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

Сообщение Alex2013 » 18.06.2015 20:56:05

Идея интересная, однако мне пока до работы с камерой в онлайн "как до луны пешкой топать "
Хотя чуть преувеличиванию кое-что уже есть
:arrow: «Доморощенный расширитель реальности »SV_MOD2
Программе есть уже сейчас есть функция "слежение" которая довольно уверенно распознает движение
ИзображениеИзображение
ИзображениеИзображение
Зеркальный лабиринт своими руками
Код: Выделить всё
Инструкция
1 Нажать "START"
Если все в порядке сразу увидите изображение веб-камеры подключенной по умолчанию (Иначе выведет диалог выбора камеры)
Если в системе не все так хорошо как хочется фон окна просто изменится и все.
НО ЭТО НЕ ОБЯЗАТЕЛЬНО ПОМЕШАЕТ ...
2 Жмем >>BUF и BUF >> Если все ок сможете увидеть кадр в окошке превъю
3 Auto Start шевелим камеру видим изменения в "Риал Тайм"
4 Нажимаем ZOOM открывается окно "безграничного преувеличения"
6 + - регулируют увеличение галка Обновить включает "РТ-Режим"
7 Скролы позволяют работать в режиме "глаза воблы"
8 Если камера не обнаружена для проверки можно использовать DScaler
(http://deinterlace.sourceforge.net/russian/FAQ.htm )
9 Функция "супер зум" (в этой версии в отдельном модуле) включаете  галку  "ОБНОВЛЕНИЕ" отмечаете часть изображения мышкой нажимаете соответствующею  кнопку..
10 Функция "Слежения" включается ответствующей галкой  открывается чб визир можно повозится с настройкой  (   Чувствительность , шаг сканера , сглаживание  ) движение показывает зелеными точками ...
Да не забывайте включать  галку  "Обновление"
(Интересно отслеживать прохожих и машины на улице и  по идее можно сделать например офисную охранную сигнализацию   с отсылкой кадров по е-майлу  или следилку за машиной под окнами ..)




После сбоя программы (На пример при многократном нажатии "START" или выходе без остановки захвата и тд может понадобится переподключение веб-камеры или перезагрузка ОС для встроенных камер )
"супер зум" в работе

Собрано в hiasm...

Зы
Но вернусь к текущему проекту ...

"Очищенный" модуль распознавания ...
Версия 0.4
-------------------------------------------------------

ИзображениеИзображение

Чтение контуров и маски из списка +
Более надежный способ взаимодействия с интерфейсом +
Простейшие распознавание +
Поворот картинки +
Коррекция размеров и вычисление верха картинки +
Распознавание повернутых картинок +
Распознавание повернутых картинок в цикле +
Пока нет
Загрузки параметров и записи результатов. -
*
Формат маски и контуров из списка : двухцветный ч/б.
Размер маски желательно 40Х40 с белой рамкой в один пиксель ...

Формат команды
RR.exe имя_файла_списка имя_файла_маски имя_файла_параметров или NP

Запуск теста R.bat
(Исходники как обычно в архиве)
:arrow: RR.zip
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение Alex2013 » 24.06.2015 03:38:21

"Очищенный" модуль распознавания ...
(Первая условно полнофункциональная версия.)

:arrow: RR_Full_01.zip

=========
Версия 0.7
-------------------------------------------------------
Чтение контуров и маски из списка +
Более надежный способ взаимодействия с интерфейсом +
Простейшие распознавание +
Поворот картинки +
Коррекция размеров и вычисление верха картинки +
Распознавание повернутых картинок +
Распознавание повернутых картинок в цикле +

Загрузка параметров +
RECOG.INI
Код: Выделить всё

[MAIN]
// Шаг поворота
StepR=10
// Максимально допустимый шум %
MaxTresh=35
// Минимальное совпадение %
MinEQ=75
//Начальный угол
BeginAngle=0
//Конечный угол
EndAngle=360
// Минимальная демонстратция
MinView=1
// Выход после завершения сравнеиня
AutoExit=0


Дополнительные параметры AutoExit и MinView +
Вычисление лучшего совпадения .... +
Начальный и конечный угол в параметрах +
Запись результатов +
( Если результат есть его записывают в 'RESULT.INI')
*Контур черный более чем на 60% считается "Черным контуром" и
выводится из числа распознаваемых образов "

При MinView=1 вид программы изменяется на "текстовый" для ускорения работы ...
ИзображениеИзображение

"Реально повернутые" образы распознает при установке 50% совладения
(MinEQ=50 ) но вроде довольно стабильно ...

Думаю что завтра объединю обе части проекта .
Зы
Комбинаторика в отсутствии достаточно сложной практики малость "затупилась" ..
Код до сих пор чуть хромает "на логику" ( вроде и несложно но удерживать в голове все возможные варианты временами трудновато ..) Например есть место где две независимые переменные создают что-то вроде системы уравнений с двумя неизвестными . Как-то выкрутится но чувствую что остались комбинации которые я пока не учел ... :roll: Впрочем "утро вечера мудреней " !
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение Alex2013 » 25.06.2015 23:28:10

Итак "Подопытная программа" снова в сборе ...

:arrow: RG_4_2
ИзображениеИзображение
RG 4_2
Подключил выделенные в отдельный модуль этапы с 5-го по 7-мой .
(То есть собственно распознавание образов )
В исходных данных передается название файла образца(маски) и список контуров для распознавания. +
Обработка результатов распознавания (Не в полном объеме). +
Настройка параметров из основной программы. +

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

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

Сообщение Pavia » 28.06.2015 09:17:46

Ждёмс новых опытом и успехов.

Цвет довольно широко плавает, а вот контур не так сильно поэтому с контурами и работают.

Для зачернения, а вернее бинаризации могу предложить вот такой вот алгоритм.
Зачерняется, то что больше TMax, а всё что меньше Tmin забеляется. А по серёдке между этими значениями зачерняются те, которые располагаются по соседству с уже зачерненными пикселями.
Хорошо обходит проблему с шумами и не требует медленной операции сглаживания.

Код: Выделить всё
// Гистерезисный порог
procedure HysteresisThreshold_approximate_Base(var r:TByteMap; bm:TByteMap; Tmin,TMax:Integer); Overload;
{14-20 тик на пиксель 1 канал}
var i,j:Integer;
LL:Integer;
p,p1,p2:PAByte;
// Реализация в 4 прохода с частичной потерью точности.
begin
p:=R.ScanLine[0];
p1:=bm.ScanLine[0];
  for i:=1 to bm.Width-1 do
   begin
   if p1[i]> Tmin then p[i]:=80;
   if (p1[i]> Tmax) or (p[i-1]=255) then p[i]:=255;
   end;

for j:=1  to bm.Height-1 do
  begin
  p:=R.ScanLine[j];
  p2:=R.ScanLine[j-1];
  p1:=bm.ScanLine[j];
  for i:=1 to bm.Width-1 do
   begin
   p[i]:=0;
   if (p1[i]> Tmin) then
     begin
     p[i]:=$80;
     if (p[i-1]=255) or (p2[i]=255) then p[i]:=255;
     end;
   if (p1[i]> Tmax) then p[i]:=255;

   end;
  end;
// Обратный проход
  p:=R.ScanLine[bm.Height-1];
  p1:=bm.ScanLine[bm.Height-1];
  for i:=bm.Width-2 downto 0 do
   begin
   if (p[i]= $80) and (p[i+1]=255) then p[i]:=255;
   end;
for j:=bm.Height-2 downto 0 do
  begin
  p:=R.ScanLine[j];
  p2:=R.ScanLine[j+1];
  p1:=bm.ScanLine[j];
  for i:=bm.Width-2 downto 0 do
   begin
   if (p[i]= $80) and ((p[i+1]=255) or (p2[i]=255)) then p[i]:=255;
//   if (p[i]= $80) then p[i]:=0;
   end;
  end;
// 3 проход
p:=R.ScanLine[0];
p1:=bm.ScanLine[0];
  for i:=1 to bm.Width-1 do
   begin
   if (p[i]=$80) and (p[i-1]=255) then p[i]:=255;
   end;

for j:=1  to bm.Height-1 do
  begin
  p:=R.ScanLine[j];
  p2:=R.ScanLine[j-1];
  p1:=bm.ScanLine[j];
  for i:=1 to bm.Width-1 do
   begin
   if (p[i]=$80) and ((p[i-1]=255) or (p2[i]=255)) then p[i]:=255;
   end;
  end;
// 4 проход
// Обратный проход 2
  p:=R.ScanLine[bm.Height-1];
  p1:=bm.ScanLine[bm.Height-1];
  for i:=bm.Width-2 downto 0 do
   begin
   if (p[i]= $80) and (p[i+1]=255) then p[i]:=255;
   end;
for j:=bm.Height-2 downto 0 do
  begin
  p:=R.ScanLine[j];
  p2:=R.ScanLine[j+1];
  p1:=bm.ScanLine[j];
  for i:=bm.Width-2 downto 0 do
   begin
   if (p[i]= $80) and ((p[i+1]=255) or (p2[i]=255)) then p[i]:=255;
   if (p[i]= $80) then p[i]:=0;
   end;
  end;
end;
Аватара пользователя
Pavia
постоялец
 
Сообщения: 290
Зарегистрирован: 07.01.2011 12:46:51

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

Сообщение Alex2013 » 28.06.2015 17:45:26

Спасибо ! :idea:
Погоняю ...
ЗЫ Вообще я додумался до более простой идеи вместо сглаживания думаю просто объединять близко находящиеся контуры ....
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение Alex2013 » 08.07.2015 03:23:24

Проект не заброшен но вот уже несколько дней занят подключением скриптового движка ... Думаю что для исследовательской платформы такой подход будет гораздо удобнее постоянного вмешательства в основной код.
Да и возможных "внешних глюков" (Например неожиданных проблем с осью библиотеками или железом ) может по идее существенно поубавится .( Скрипты содержат только работу с данными все наглядно и четко разделено все не обходимое упрятано во внешние функции .)
В принципе это что-то вроде "Метода грубой силы" но при недостатке знаний разных особенностей LCL и FPC помогает неплохо ...
:idea:
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение Alex2013 » 09.07.2015 21:00:50

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

НОВАЯ ВЕРСИЯ "Лаборатории распознавания образов"
---------------------------------------------------------------------------
Главные особенности новой версии проекта
1 Сразу планируется подключение к вебкамере
2 Работа со скриптами
3 Планируется возможность смены алгоритма обработки изображений "налету"
без изменения кода основной программы

Что уже есть ?
1 Интерфейс "Живая рыба" :D
(В отличии от просто «рыбы» большая часть заявленного работает...
2 Загрузка списков параметров и основных изображений
( Кадр (пока из файла) и эталоны )
3 В первом приближении подключен скрипт
4 Создан минимальны набор функций доступных из скрипта
6 Подключен лог процесса обработки
7 Добавил функции создания именованных переменных и доступа к ним из любого последовательно вызываемого скрипта
(Сделал единый список параметров доступный из скрипта )
8 Запустил реальный конвейер обработки
(То есть читает и последовательно выполняет скрипты из списка
уже переделал под скрипты два первых этапа то есть «порог», и упрощенное «сглаживание».)

Ближайшие перспективы

1 Функция захвата изображения с веб-камеры ....
2 Реализовать все необходимые методы в форме скриптов.
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение Pavia » 10.07.2015 13:16:04

Не хочу вас расстраивать. Больно хорошо идёт.
А по поводу скриптов это Вы зря за них взялись. Преимуществ в них никаких не вижу. Ибо если менять, то менять приходится всё. Правда если вы хотите оставить 90 ручного труда то по чему бы и нет.

Да и тестировать надо не на одном изображении не на 1 видео не на 1 камере. А хотя бы десяток. А лучше к 100 что-бы в процентном отношение оценить качество работы. Доведете качество до 95% можно переходить к 1 000 образцам. По поводу подбора параметров. Если делаете ручками то перебрать не более 10 вариантов не тратьте своё время. Потом всё равно будет делать обучение и подбор по выборке.

А вот камеру жду. Охота посмотреть чем сейчас популярно пользоваться.
По поводу не доделок не бойся. Они нескончаемы. Сам вот планирую пару функций дописать и опубликовать наработки.
Аватара пользователя
Pavia
постоялец
 
Сообщения: 290
Зарегистрирован: 07.01.2011 12:46:51

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

Сообщение Alex2013 » 10.07.2015 15:34:37

Да уж..."Больно хорошо идёт." больно ключевое слово ...
Вообще-то думал управится за неделю . :roll: (Ну максимум за две основные идеи были понятны еще за долго до появления этой темы ... ) Результат с 23-го мая воз и ныне там (и это уже третий вариант проекта )...Ну не совсем, локальные подвижки есть кое что наработано и опробовано кое отчего отказался .


А скрипт ВЕШЬ буквально вчера точнее сегодня ночью сделал скрипт поиска контуров .
(Диалект паскаля все-же чуть другой так что пришлось немного попотеть )
Но полная локализация "мясного кода " от превратностей оси и LCL и т.д. и т.п. это сказка !
(То есть СРАЗУ понятно где что-то не так )
Что до "ручного труда" то поскольку я начинал еще в "мохнатом досе" то это не очень меня смущает .

Да и "мясо" все равно нужно писать руками ...
Есть проблемы отладкой и поиском синтаксических ошибок но это в принципе решаемо (пока скрипты не очень большие можно просто закомментировать код и последовательно открывать вплоть до локализации ошибки ( это описывать долго на самом деле все просто и ясно ) если понадобиться подключить что-то побольше вообще-то есть встроенный построчный анализ при компиляции нужно только чуть повозится с подключением но пока и так обхожусь )

Единственный реальный минус сравнительно низкая скорость выполнения ...

Но во первых не на порядки, а в разы во вторых проект исследовательский,в третьих есть забавный фокус ( дело в том что отлаженный скрипт можно вставлять в код основной программы без малейших правок потому что ОБРАТНАЯ СОВМЕСТИМОСТЬ ПОЛНАЯ ) :idea:

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

Добавлено спустя 9 часов 55 минут 18 секунд:


ИзображениеИзображение
Главное новшество недели захват изображения ...

(Код для захвата изображения выдран "с мясом" без особого понимания механики и нуждается в доработке .... Но уже работает ! )

Кроме того добавил мастер создания скриптов (Даже с возможностью проверки и запуска ).
Проверка "молчаливая" ,если скрипт компилируется ни каких сообщений не видно .
(Тот массседж что виден на скрине выдается уже сами сриптом .)

===================================================

:arrow: Nv_BETA002.zipСКАЧАТЬ

Вчера вечером сделал описания функций (См README.TXT)
Чуть поправил скрипт поиска контуров
Добавил несколько новых функций для скрипта
И файл глобального дампа параметров (Можно посмотреть результаты поиска контуров )
---------------------------------------------------------------------------------------------------------------------
В общем еще немного и можно заняться самым интересным :
Поиском и разработкой алгоритмов распознавания маркеров и созданием разных "дополнений к реальности" ...
Последний раз редактировалось Alex2013 12.10.2020 17:30:31, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение Alex2013 » 15.07.2015 23:05:47

Что нового ?
1 "Добил " почти все функции для скриптов.
2 Начал писать основные скрипты
Думаю скоро доведу до "идейного уровня" предыдущих "без скриптовой" версий .

Зы
Уже в следующей бетке можно будет делать практически ВСЕ что нужно рамках проекта без изменения основной софтины ... Так что если кому интересно готовьте свои скрипты ! :idea:

Код: Выделить всё

ПРИЛОЖЕНИЕ 1  Внешние Функции доступные из скрипта .
------------------------------------------------------
/// Основной набор
//Установить параметр или создать новый
Procedure SetParam(Name,Param:String);
//Получить параметр по имени
Function GetParam(Name:String):String;
//Получить ширину обрабатываемого изображения (пока одного из трех)
Function GetWidth(N:Integer):Integer;
// Получить высоту обрабатываемого изображения (пока одного из трех)
Function GetHeight(N:Integer):Integer;
// Изменить цвет точки (N(0..2) – номер изображения X Y Координаты точки )
Procedure SetPixel(N,X,Y,C:LongInt);
// Получить    цвет точки (N(0..2) – номер изображения X Y Координаты точки)
Function GetPixel(N,X,Y:LongInt):LongInt);
// Записать строку для лога
Procedure SResult(S:String);
//  Выдать сообщение
Procedure MSG (S:String);
//  Выдать  расширенное сообщение
Procedure WForm(M:String);
//Изменить состояние «полосы прогресса»
Procedure RunTime (M,T:Integer);
// Функции работы с цветом
function Red(rgb: LongInt): BYTE;
function Green(rgb: LongInt): BYTE;
function Blue(rgb: LongInt): BYTE;
function RGB(R, G, B: Byte):Longint;
// Яркость точки
// function BWColor(C: LongInt): BYTE;
// Функция  копирования изображения
//(N1 -> N2)
// 0- Исходный кадр
// 1- Рабочий кадр (Обновляется после каждого этапа )
// 2- Запасной буфер
Procedure CopyImage(N1,N2:Integer);
// Функции работы со списком маркеров
function GetCountMarkerList:Longint;
Function MarkerWidth(N:Integer):Integer;
Function MarkerHeight(N:Integer):Integer;
Function GetMarkerPixel(N,X,Y:Integer):Integer;
Procedure SetMarkerPixel(N,X,Y,C:Integer);
//ДОПОЛНЕНИЕ Функции работы с рабочим списком
//1 Копировать область  из осиновых изображений
//и добавить ее в рабочий список  …
// (N 0-2 номер основного изображения )
Function  ACopyIRToWork(N,X,Y,W,H:integer):integer;
//2 Добавить  в рабочий список эталон  маркера с масштабированием
//  (N номер в списке маркеров  )
Function  MaskToWork(N,W,H:integer):integer;
//3 Изменить размер изображения в рабочем списке
//  (N номер в списке маркеров  )
Procedure   WReSize(N,W,H:integer);
//4  Наложение изображения с логической операцией
// N1->N2  Mode – режим наложения
// Обычно нужно mode = cmSrcPaint = $00EE0086;
Procedure   WLogicCopy(N1,N2,Mode:integer);
---------------- Полный список режимов ------------------
const
  cmBlackness = BLACKNESS;
  cmDstInvert = DSTINVERT;
  cmMergeCopy = MERGECOPY;
  cmMergePaint = MERGEPAINT;
  cmNotSrcCopy = NOTSRCCOPY;
  cmNotSrcErase = NOTSRCERASE;
  cmPatCopy = PATCOPY;
  cmPatInvert = PATINVERT;
  cmPatPaint = PATPAINT;
  cmSrcAnd = SRCAND;
  cmSrcCopy = SRCCOPY;
  cmSrcErase = SRCERASE;
  cmSrcInvert = SRCINVERT;
  cmSrcPaint = SRCPAINT;
  cmWhiteness = WHITENESS;
  SRCCOPY     = $00CC0020;     { dest = source                    }
  SRCPAINT    = $00EE0086;     { dest = source OR dest            }
  SRCAND      = $008800C6;     { dest = source AND dest           }
  SRCINVERT   = $00660046;     { dest = source XOR dest           }
  SRCERASE    = $00440328;     { dest = source AND (NOT dest )    }
  NOTSRCCOPY  = $00330008;     { dest = (NOT source)              }
  NOTSRCERASE = $001100A6;     { dest = (NOT src) AND (NOT dest)  }
  MERGECOPY   = $00C000CA;     { dest = (source AND pattern)      }
  MERGEPAINT  = $00BB0226;     { dest = (NOT source) OR dest      }
  PATCOPY     = $00F00021;     { dest = pattern                   }
  PATPAINT    = $00FB0A09;     { dest = DPSnoo                    }
  PATINVERT   = $005A0049;     { dest = pattern XOR dest          }
  DSTINVERT   = $00550009;     { dest = (NOT dest)                }
  BLACKNESS   = $00000042;     { dest = BLACK                     }
  WHITENESS   = $00FF0062;     { dest = WHITE                     }
//5 Количество изображений  в рабочем списке
Function  WCount:integer;
//6 Повернуть изображение (А -угол в градусах)
// N-номер изображения в рабочем списке
Procedure WRotate(N,A:integer);
//7 Получить цвет точки N-номер номер в рабочем списке X Y Координаты точки
Function WGetPixel(N,X,Y:Integer):Integer;
//8 Изменить цвет точки N-номер в рабочем списке X Y Координаты точки
Procedure WSetPixel(N,X,Y,C:Integer);
//9 Очистить рабочий список
Procedure  WClear;
//10  Получить ширину  изображения  в рабочем списке
Function WWidth(N:Integer):Integer;
//11  Получить высоту изображения  в рабочем списке
Function WHeight(N:Integer):Integer;


-------------------------------------
Умф добрался я до скриптов и с ужасом обнаружил не только тормоз но и "загадочное" поведение (Рунтайм ЕГГОР...) при глубокой рекурсии .... (То есть понятно что при больших контурах стека не хватает но непонятно почему ...)
Ну да ладно сделал проще взял да упрятал "загадочный код" с рекурсией во внешнюю процедуру ...

Еще с делал пару внешних процедур (вызываемых из скриптов ) для наблюдения за процессом ...
Все заработало хотя тоже не с первого раза ... (За одно проверил в функцию поворота и работы с "рабочим списком " )



:idea:
ИзображениеИзображение
В общем понял что пока не отлажу все функции выкладывать третью бету рановато ...
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение Alex2013 » 20.07.2015 01:58:48

И так "Маяк то потухнет то погаснет ..."
А у меня на собиралось дополнений и исправлений на новую бетку .. :D

:arrow: Nv_BETA003.zip
В этой версии уже можно увидеть явные попытки распознавания причем даже "повернутого на 360 градусов " :wink: ... Особенность версии серии скриптов отвечающих за "рас-познание" в том что они требуют "одно контурных" маркеров .. То есть можно попытаться распознать хоть автограф Пушкина но... только если он будет слитным без отдельных деталей ... (Что значит что встроенный "по умолчанию" пример не работает и что нужно загрузить изображения ( в нулевой маркер и кадр ) самостоятельно ....)
ИзображениеИзображение

Основные усилия уже уходят в на написание скриптов, что радует...(Хотя я честно сказать думал, что процесс будет как-то попроще ... но может просто не "набил руку" ) Но в общем "идейный уровень" предыдущей версии можно считать успешно достигнут и даже чуть превзойден! Разумеется многое нуждается в доработке .

Но поскольку эта версия проекта основана на "новых физических принципах" то есть на применении скриптового движка покрайней мере есть шанс что я её не заброшу из за "синдрома вертикального прогресса " (Это когда сложность программы скачком уходит за пределы моего скромного понимания ) ....
Уже сейчас большая часть функций нужных для продолжения исследований отлажена , проверена и что главное доступна из скриптов ... (Добавить или изменить походу дела тоже не проблема )

Чем кстати кроме прочего хороша "скриптовая модель" так это возможностью практически в один "копи-паст " переносить отлаженные фрагменты в основной код ...

Зы
К сожалению не все пока описано в README как надо но разобрать "что и где"(где "рыбу заворачивали" например :D ) и при наличии примеров и исходников не так уж трудно ...
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение Pavia » 20.07.2015 11:36:19

Надо отлаживать.
1) Один раз вылетела.
2) Два раза RunTime Error
3) Один раз спросило про квадрат затем свернуло окно. Но судя по всему до 4-5 этапов дело не дошло.

Так что пока дальше двигаться не имеет смысла. Надо устранить ошибки.
"синдрома вертикального прогресса " (Это когда сложность программы скачком уходит за пределы моего скромного понимания ) ..
Будут вопросы пишите постараюсь ответить. Сейчас скорее всего вас тормозят скрипты. Если у вас есть Delphi XE то неплохо прогнать код через него. И посмотреть какие ошибки и предупреждения он пишет. Статический анализ вещь хорошая читаешь и видишь ошибки. Но скорее всего у вас ошибки стандартного плана выход за границы массива.
Ну да так и есть. Открываем 1 скрипт.

Код: Выделить всё
For Y:=0 to H do begin
For X:=0 to W do  begin


В функции SOBJ тоже не проверяется выход за границы изображения. Правда там достаточно просто подсунуть изображение на 2 пикселя больше и по периметру нарисовать защитную рамку к примеру белого цвета.

Рекурсию да надо поправить. Стек он ограничен по умолчанию 64 кБ и локальные переменные и те что в параметрах хранятся в стеке. Решается легко создаётся структура данных со свойствами стека на основе массива. Либо сразу задаёшь нужный размер или динамически увеличиваешь в 2 раза.
Аватара пользователя
Pavia
постоялец
 
Сообщения: 290
Зарегистрирован: 07.01.2011 12:46:51

Пред.След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: bormant и гости: 31

Рейтинг@Mail.ru