Серия проектов "Дополнение к реальности "
Модератор: Модераторы
мой единственынй совет - создать проект на любом хостинге проектов.
Там и доступ будет публичный всем в любой момент суток, ну и документацию с баг трекером можнно вести.
Там и доступ будет публичный всем в любой момент суток, ну и документацию с баг трекером можнно вести.
В проект в том виде в котором он прибивает сейчас ? Не думаю вот чуть позже возможно ...
К тому-же есть особенности моих привычек : Я использую виндовс только в оффлайне, а там все основные инструменты да и привычней...
Перегружается в "боевой онлайн" слишком часто чуть муторно .
Возможно запущу одну из резервных железяк для сети (раннее думал сделать наоборот но слишком они уже не стабильны или стары) тогда возможно будет возможность легко и непринужденно поддерживать свой репозитарий или что-то вроде SVN...
Зы
Метод поворота через "искажение континуума" все-же работает ..
Использовать так
Запустить GetRSize для пересчета
создать изменить размер и закрасить если надо исходящий битмап
и применить DrawRotatedBitmap для поворота
как-то так
К тому-же есть особенности моих привычек : Я использую виндовс только в оффлайне, а там все основные инструменты да и привычней...
Перегружается в "боевой онлайн" слишком часто чуть муторно .
Возможно запущу одну из резервных железяк для сети (раннее думал сделать наоборот но слишком они уже не стабильны или стары) тогда возможно будет возможность легко и непринужденно поддерживать свой репозитарий или что-то вроде 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 для поворота
как-то так
Код: Выделить всё
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;
Добавлю немного фантастики в тему, для размышления.
На днях читал статью по двухстороннюю связь через оптику не ослепляющих фар автомобиля. Суть в том, что на короткие промежутки времени(не видимые глазу) светодиоды в фарах авто потухают и работают на прием. Идея была сделать высокочастотные модуляторы связи там. Отсюда вопрос, если программа "Дополнения реальности" использует метки свои в виде линий каких то, то возможно ли сделать чтобы она считывала через веб камеру картинку и если на ней есть точка мерцающая с частотой определенной, то определяла ее как метку? Или частоты работы веб камеры будет не достаточно?
В фильме "Особое мнение" герой использует перчатки http://www.blowcreative.co.uk/uploads/n ... cruise.jpg, на каждой руке две точки светящиеся. В принципе четыре таких точки являются маркерами очень удобными, которые стабильно дают свое положение и на основе их перемещения можно сделать интерфейс управления тем же zcad, который делается в соседней теме. И выключить их для избежания ошибки ввода проще, нежели камера бы просто жесты читала.
На днях читал статью по двухстороннюю связь через оптику не ослепляющих фар автомобиля. Суть в том, что на короткие промежутки времени(не видимые глазу) светодиоды в фарах авто потухают и работают на прием. Идея была сделать высокочастотные модуляторы связи там. Отсюда вопрос, если программа "Дополнения реальности" использует метки свои в виде линий каких то, то возможно ли сделать чтобы она считывала через веб камеру картинку и если на ней есть точка мерцающая с частотой определенной, то определяла ее как метку? Или частоты работы веб камеры будет не достаточно?
В фильме "Особое мнение" герой использует перчатки http://www.blowcreative.co.uk/uploads/n ... cruise.jpg, на каждой руке две точки светящиеся. В принципе четыре таких точки являются маркерами очень удобными, которые стабильно дают свое положение и на основе их перемещения можно сделать интерфейс управления тем же zcad, который делается в соседней теме. И выключить их для избежания ошибки ввода проще, нежели камера бы просто жесты читала.
Идея интересная, однако мне пока до работы с камерой в онлайн "как до луны пешкой топать "
Хотя чуть преувеличиванию кое-что уже есть
«Доморощенный расширитель реальности »SV_MOD2
Программе есть уже сейчас есть функция "слежение" которая довольно уверенно распознает движение




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


Чтение контуров и маски из списка +
Более надежный способ взаимодействия с интерфейсом +
Простейшие распознавание +
Поворот картинки +
Коррекция размеров и вычисление верха картинки +
Распознавание повернутых картинок +
Распознавание повернутых картинок в цикле +
Пока нет
Загрузки параметров и записи результатов. -
*
Формат маски и контуров из списка : двухцветный ч/б.
Размер маски желательно 40Х40 с белой рамкой в один пиксель ...
Формат команды
RR.exe имя_файла_списка имя_файла_маски имя_файла_параметров или NP
Запуск теста R.bat
(Исходники как обычно в архиве)
RR.zip
Хотя чуть преувеличиванию кое-что уже есть
Программе есть уже сейчас есть функция "слежение" которая довольно уверенно распознает движение




Зеркальный лабиринт своими руками
Код: Выделить всё
Инструкция
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
(Исходники как обычно в архиве)
"Очищенный" модуль распознавания ...
(Первая условно полнофункциональная версия.)
RR_Full_01.zip
=========
Версия 0.7
-------------------------------------------------------
Чтение контуров и маски из списка +
Более надежный способ взаимодействия с интерфейсом +
Простейшие распознавание +
Поворот картинки +
Коррекция размеров и вычисление верха картинки +
Распознавание повернутых картинок +
Распознавание повернутых картинок в цикле +
Загрузка параметров +
RECOG.INI
Дополнительные параметры AutoExit и MinView +
Вычисление лучшего совпадения .... +
Начальный и конечный угол в параметрах +
Запись результатов +
( Если результат есть его записывают в 'RESULT.INI')
*Контур черный более чем на 60% считается "Черным контуром" и
выводится из числа распознаваемых образов "
При MinView=1 вид программы изменяется на "текстовый" для ускорения работы ...


"Реально повернутые" образы распознает при установке 50% совладения
(MinEQ=50 ) но вроде довольно стабильно ...
Думаю что завтра объединю обе части проекта .
Зы
Комбинаторика в отсутствии достаточно сложной практики малость "затупилась" ..
Код до сих пор чуть хромает "на логику" ( вроде и несложно но удерживать в голове все возможные варианты временами трудновато ..) Например есть место где две независимые переменные создают что-то вроде системы уравнений с двумя неизвестными . Как-то выкрутится но чувствую что остались комбинации которые я пока не учел ...
Впрочем "утро вечера мудреней " !
(Первая условно полнофункциональная версия.)
=========
Версия 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 ) но вроде довольно стабильно ...
Думаю что завтра объединю обе части проекта .
Зы
Комбинаторика в отсутствии достаточно сложной практики малость "затупилась" ..
Код до сих пор чуть хромает "на логику" ( вроде и несложно но удерживать в голове все возможные варианты временами трудновато ..) Например есть место где две независимые переменные создают что-то вроде системы уравнений с двумя неизвестными . Как-то выкрутится но чувствую что остались комбинации которые я пока не учел ...
Итак "Подопытная программа" снова в сборе ...
RG_4_2


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


RG 4_2
Подключил выделенные в отдельный модуль этапы с 5-го по 7-мой .
(То есть собственно распознавание образов )
В исходных данных передается название файла образца(маски) и список контуров для распознавания. +
Обработка результатов распознавания (Не в полном объеме). +
Настройка параметров из основной программы. +
Почти все что можно из этой "тестовой платформы" с синтетикой (искусственными тестовыми изображениями) выжал ..
Нужно переходить к работе с реальными изображения от веб камеры .
Но важно хорошо продумать "пред обработку " то что я делаю со сглаживанием и "очернением" неплохо только для постановки опытов... При работе с реальным изображением нужно что-то точнее и быстрее ...
Ждёмс новых опытом и успехов.
Цвет довольно широко плавает, а вот контур не так сильно поэтому с контурами и работают.
Для зачернения, а вернее бинаризации могу предложить вот такой вот алгоритм.
Зачерняется, то что больше TMax, а всё что меньше Tmin забеляется. А по серёдке между этими значениями зачерняются те, которые располагаются по соседству с уже зачерненными пикселями.
Хорошо обходит проблему с шумами и не требует медленной операции сглаживания.
Цвет довольно широко плавает, а вот контур не так сильно поэтому с контурами и работают.
Для зачернения, а вернее бинаризации могу предложить вот такой вот алгоритм.
Зачерняется, то что больше 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;Спасибо !
Погоняю ...
ЗЫ Вообще я додумался до более простой идеи вместо сглаживания думаю просто объединять близко находящиеся контуры ....
Погоняю ...
ЗЫ Вообще я додумался до более простой идеи вместо сглаживания думаю просто объединять близко находящиеся контуры ....
Проект не заброшен но вот уже несколько дней занят подключением скриптового движка ... Думаю что для исследовательской платформы такой подход будет гораздо удобнее постоянного вмешательства в основной код.
Да и возможных "внешних глюков" (Например неожиданных проблем с осью библиотеками или железом ) может по идее существенно поубавится .( Скрипты содержат только работу с данными все наглядно и четко разделено все не обходимое упрятано во внешние функции .)
В принципе это что-то вроде "Метода грубой силы" но при недостатке знаний разных особенностей LCL и FPC помогает неплохо ...

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


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


(Пока недоделку выкладывать не буду и так уже чуть засорил тему но возможно уже завтра «добью» до приемлемого уровня и выложу.... )
И так ...
НОВАЯ ВЕРСИЯ "Лаборатории распознавания образов"
---------------------------------------------------------------------------
Главные особенности новой версии проекта
1 Сразу планируется подключение к вебкамере
2 Работа со скриптами
3 Планируется возможность смены алгоритма обработки изображений "налету"
без изменения кода основной программы
Что уже есть ?
1 Интерфейс "Живая рыба"
(В отличии от просто «рыбы» большая часть заявленного работает...
2 Загрузка списков параметров и основных изображений
( Кадр (пока из файла) и эталоны )
3 В первом приближении подключен скрипт
4 Создан минимальны набор функций доступных из скрипта
6 Подключен лог процесса обработки
7 Добавил функции создания именованных переменных и доступа к ним из любого последовательно вызываемого скрипта
(Сделал единый список параметров доступный из скрипта )
8 Запустил реальный конвейер обработки
(То есть читает и последовательно выполняет скрипты из списка
уже переделал под скрипты два первых этапа то есть «порог», и упрощенное «сглаживание».)
Ближайшие перспективы
1 Функция захвата изображения с веб-камеры ....
2 Реализовать все необходимые методы в форме скриптов.
Не хочу вас расстраивать. Больно хорошо идёт.
А по поводу скриптов это Вы зря за них взялись. Преимуществ в них никаких не вижу. Ибо если менять, то менять приходится всё. Правда если вы хотите оставить 90 ручного труда то по чему бы и нет.
Да и тестировать надо не на одном изображении не на 1 видео не на 1 камере. А хотя бы десяток. А лучше к 100 что-бы в процентном отношение оценить качество работы. Доведете качество до 95% можно переходить к 1 000 образцам. По поводу подбора параметров. Если делаете ручками то перебрать не более 10 вариантов не тратьте своё время. Потом всё равно будет делать обучение и подбор по выборке.
А вот камеру жду. Охота посмотреть чем сейчас популярно пользоваться.
По поводу не доделок не бойся. Они нескончаемы. Сам вот планирую пару функций дописать и опубликовать наработки.
А по поводу скриптов это Вы зря за них взялись. Преимуществ в них никаких не вижу. Ибо если менять, то менять приходится всё. Правда если вы хотите оставить 90 ручного труда то по чему бы и нет.
Да и тестировать надо не на одном изображении не на 1 видео не на 1 камере. А хотя бы десяток. А лучше к 100 что-бы в процентном отношение оценить качество работы. Доведете качество до 95% можно переходить к 1 000 образцам. По поводу подбора параметров. Если делаете ручками то перебрать не более 10 вариантов не тратьте своё время. Потом всё равно будет делать обучение и подбор по выборке.
А вот камеру жду. Охота посмотреть чем сейчас популярно пользоваться.
По поводу не доделок не бойся. Они нескончаемы. Сам вот планирую пару функций дописать и опубликовать наработки.
Да уж..."Больно хорошо идёт." больно ключевое слово ...
Вообще-то думал управится за неделю .
(Ну максимум за две основные идеи были понятны еще за долго до появления этой темы ... ) Результат с 23-го мая воз и ныне там (и это уже третий вариант проекта )...Ну не совсем, локальные подвижки есть кое что наработано и опробовано кое отчего отказался .
А скрипт ВЕШЬ буквально вчера точнее сегодня ночью сделал скрипт поиска контуров .
(Диалект паскаля все-же чуть другой так что пришлось немного попотеть )
Но полная локализация "мясного кода " от превратностей оси и LCL и т.д. и т.п. это сказка !
(То есть СРАЗУ понятно где что-то не так )
Что до "ручного труда" то поскольку я начинал еще в "мохнатом досе" то это не очень меня смущает .
Да и "мясо" все равно нужно писать руками ...
Есть проблемы отладкой и поиском синтаксических ошибок но это в принципе решаемо (пока скрипты не очень большие можно просто закомментировать код и последовательно открывать вплоть до локализации ошибки ( это описывать долго на самом деле все просто и ясно ) если понадобиться подключить что-то побольше вообще-то есть встроенный построчный анализ при компиляции нужно только чуть повозится с подключением но пока и так обхожусь )
Единственный реальный минус сравнительно низкая скорость выполнения ...
Но во первых не на порядки, а в разы во вторых проект исследовательский,в третьих есть забавный фокус ( дело в том что отлаженный скрипт можно вставлять в код основной программы без малейших правок потому что ОБРАТНАЯ СОВМЕСТИМОСТЬ ПОЛНАЯ )
Зы
Не доделки не доделкам рознь ... Есть просто не красивая реализация, а есть ее отсутствие ...
Не люблю вкладывать "рыбу" даже с частично не нажимаемыми кнопками .
(Пусть даже все необходимое можно сделать в обход через правку файлов списков )
Добавлено спустя 9 часов 55 минут 18 секунд:


Главное новшество недели захват изображения ...
(Код для захвата изображения выдран "с мясом" без особого понимания механики и нуждается в доработке .... Но уже работает ! )
Кроме того добавил мастер создания скриптов (Даже с возможностью проверки и запуска ).
Проверка "молчаливая" ,если скрипт компилируется ни каких сообщений не видно .
(Тот массседж что виден на скрине выдается уже сами сриптом .)
===================================================
Nv_BETA002.zipСКАЧАТЬ
Вчера вечером сделал описания функций (См README.TXT)
Чуть поправил скрипт поиска контуров
Добавил несколько новых функций для скрипта
И файл глобального дампа параметров (Можно посмотреть результаты поиска контуров )
---------------------------------------------------------------------------------------------------------------------
В общем еще немного и можно заняться самым интересным :
Поиском и разработкой алгоритмов распознавания маркеров и созданием разных "дополнений к реальности" ...
Вообще-то думал управится за неделю .
А скрипт ВЕШЬ буквально вчера точнее сегодня ночью сделал скрипт поиска контуров .
(Диалект паскаля все-же чуть другой так что пришлось немного попотеть )
Но полная локализация "мясного кода " от превратностей оси и LCL и т.д. и т.п. это сказка !
(То есть СРАЗУ понятно где что-то не так )
Что до "ручного труда" то поскольку я начинал еще в "мохнатом досе" то это не очень меня смущает .
Да и "мясо" все равно нужно писать руками ...
Есть проблемы отладкой и поиском синтаксических ошибок но это в принципе решаемо (пока скрипты не очень большие можно просто закомментировать код и последовательно открывать вплоть до локализации ошибки ( это описывать долго на самом деле все просто и ясно ) если понадобиться подключить что-то побольше вообще-то есть встроенный построчный анализ при компиляции нужно только чуть повозится с подключением но пока и так обхожусь )
Единственный реальный минус сравнительно низкая скорость выполнения ...
Но во первых не на порядки, а в разы во вторых проект исследовательский,в третьих есть забавный фокус ( дело в том что отлаженный скрипт можно вставлять в код основной программы без малейших правок потому что ОБРАТНАЯ СОВМЕСТИМОСТЬ ПОЛНАЯ )
Зы
Не доделки не доделкам рознь ... Есть просто не красивая реализация, а есть ее отсутствие ...
Не люблю вкладывать "рыбу" даже с частично не нажимаемыми кнопками .
(Пусть даже все необходимое можно сделать в обход через правку файлов списков )
Добавлено спустя 9 часов 55 минут 18 секунд:


Главное новшество недели захват изображения ...
(Код для захвата изображения выдран "с мясом" без особого понимания механики и нуждается в доработке .... Но уже работает ! )
Кроме того добавил мастер создания скриптов (Даже с возможностью проверки и запуска ).
Проверка "молчаливая" ,если скрипт компилируется ни каких сообщений не видно .
(Тот массседж что виден на скрине выдается уже сами сриптом .)
===================================================
Вчера вечером сделал описания функций (См README.TXT)
Чуть поправил скрипт поиска контуров
Добавил несколько новых функций для скрипта
И файл глобального дампа параметров (Можно посмотреть результаты поиска контуров )
---------------------------------------------------------------------------------------------------------------------
В общем еще немного и можно заняться самым интересным :
Поиском и разработкой алгоритмов распознавания маркеров и созданием разных "дополнений к реальности" ...
Последний раз редактировалось Alex2013 12.10.2020 16:30:31, всего редактировалось 1 раз.
Что нового ?
1 "Добил " почти все функции для скриптов.
2 Начал писать основные скрипты
Думаю скоро доведу до "идейного уровня" предыдущих "без скриптовой" версий .
Зы
Уже в следующей бетке можно будет делать практически ВСЕ что нужно рамках проекта без изменения основной софтины ... Так что если кому интересно готовьте свои скрипты !
-------------------------------------
Умф добрался я до скриптов и с ужасом обнаружил не только тормоз но и "загадочное" поведение (Рунтайм ЕГГОР...) при глубокой рекурсии .... (То есть понятно что при больших контурах стека не хватает но непонятно почему ...)
Ну да ладно сделал проще взял да упрятал "загадочный код" с рекурсией во внешнюю процедуру ...
Еще с делал пару внешних процедур (вызываемых из скриптов ) для наблюдения за процессом ...
Все заработало хотя тоже не с первого раза ... (За одно проверил в функцию поворота и работы с "рабочим списком " )


В общем понял что пока не отлажу все функции выкладывать третью бету рановато ...
1 "Добил " почти все функции для скриптов.
2 Начал писать основные скрипты
Думаю скоро доведу до "идейного уровня" предыдущих "без скриптовой" версий .
Зы
Уже в следующей бетке можно будет делать практически ВСЕ что нужно рамках проекта без изменения основной софтины ... Так что если кому интересно готовьте свои скрипты !
Код: Выделить всё
ПРИЛОЖЕНИЕ 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;-------------------------------------
Умф добрался я до скриптов и с ужасом обнаружил не только тормоз но и "загадочное" поведение (Рунтайм ЕГГОР...) при глубокой рекурсии .... (То есть понятно что при больших контурах стека не хватает но непонятно почему ...)
Ну да ладно сделал проще взял да упрятал "загадочный код" с рекурсией во внешнюю процедуру ...
Еще с делал пару внешних процедур (вызываемых из скриптов ) для наблюдения за процессом ...
Все заработало хотя тоже не с первого раза ... (За одно проверил в функцию поворота и работы с "рабочим списком " )


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


Основные усилия уже уходят в на написание скриптов, что радует...(Хотя я честно сказать думал, что процесс будет как-то попроще ... но может просто не "набил руку" ) Но в общем "идейный уровень" предыдущей версии можно считать успешно достигнут и даже чуть превзойден! Разумеется многое нуждается в доработке .
Но поскольку эта версия проекта основана на "новых физических принципах" то есть на применении скриптового движка покрайней мере есть шанс что я её не заброшу из за "синдрома вертикального прогресса " (Это когда сложность программы скачком уходит за пределы моего скромного понимания ) ....
Уже сейчас большая часть функций нужных для продолжения исследований отлажена , проверена и что главное доступна из скриптов ... (Добавить или изменить походу дела тоже не проблема )
Чем кстати кроме прочего хороша "скриптовая модель" так это возможностью практически в один "копи-паст " переносить отлаженные фрагменты в основной код ...
Зы
К сожалению не все пока описано в README как надо но разобрать "что и где"(где "рыбу заворачивали" например
) и при наличии примеров и исходников не так уж трудно ...
А у меня на собиралось дополнений и исправлений на новую бетку ..
В этой версии уже можно увидеть явные попытки распознавания причем даже "повернутого на 360 градусов "


Основные усилия уже уходят в на написание скриптов, что радует...(Хотя я честно сказать думал, что процесс будет как-то попроще ... но может просто не "набил руку" ) Но в общем "идейный уровень" предыдущей версии можно считать успешно достигнут и даже чуть превзойден! Разумеется многое нуждается в доработке .
Но поскольку эта версия проекта основана на "новых физических принципах" то есть на применении скриптового движка покрайней мере есть шанс что я её не заброшу из за "синдрома вертикального прогресса " (Это когда сложность программы скачком уходит за пределы моего скромного понимания ) ....
Уже сейчас большая часть функций нужных для продолжения исследований отлажена , проверена и что главное доступна из скриптов ... (Добавить или изменить походу дела тоже не проблема )
Чем кстати кроме прочего хороша "скриптовая модель" так это возможностью практически в один "копи-паст " переносить отлаженные фрагменты в основной код ...
Зы
К сожалению не все пока описано в README как надо но разобрать "что и где"(где "рыбу заворачивали" например
Надо отлаживать.
1) Один раз вылетела.
2) Два раза RunTime Error
3) Один раз спросило про квадрат затем свернуло окно. Но судя по всему до 4-5 этапов дело не дошло.
Так что пока дальше двигаться не имеет смысла. Надо устранить ошибки.
Ну да так и есть. Открываем 1 скрипт.
В функции SOBJ тоже не проверяется выход за границы изображения. Правда там достаточно просто подсунуть изображение на 2 пикселя больше и по периметру нарисовать защитную рамку к примеру белого цвета.
Рекурсию да надо поправить. Стек он ограничен по умолчанию 64 кБ и локальные переменные и те что в параметрах хранятся в стеке. Решается легко создаётся структура данных со свойствами стека на основе массива. Либо сразу задаёшь нужный размер или динамически увеличиваешь в 2 раза.
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 раза.
