 Truba_DS_0_0058_5.7z
 Truba_DS_0_0058_5.7zTruba_DS_0_0058_4.
1 Галка FRob Тест фильтра Робертса (В окне "Супер зум" /только просмотр /  ) ...


"Было темно ..." Подпороговая мряка правит бал  ...   
 
 Truba_DS_0_0058_5.
2 Управляемый порог для фильтра Робертcа  [Движок под кнопкой "Захват кадров" ]
3 Галка MF Чистка мусора для фильтра Робертcа.
"Вот кто-то зашел на порог незнакомый ..." 
 
 



Зы
Можно было пробовать  фильтр Собела ... но он чуть  сложнее и  вроде как дает боле тонкие(как выясняется на практике  более толстые ... 

  ) линии при  "трассировке" так что ФС тоже  будет но чуть   позже...
- Код: Выделить всё
- //Фильтр  Робертса + Порог + Чистка 
 procedure Roberts(var Clip: TBitmap;Porog:Integer);
 Type
 BA=Array[0..1]of byte;
 var P0,P1,P2,P21:^BA;
 X,Y,V,U,C,CC: integer;
 BB:TBitmap;
 begin
 BB:=TBitmap.Create;
 bb.PixelFormat:=pf24bit;
 bb.SetSize(Clip.Width,Clip.Height);
 for Y:=1 to BB.Height-1 do
 begin
 P1:=Clip.ScanLine[Y-1];
 P0:=Clip.ScanLine[Y];
 BB.BeginUpdate(False);
 P2:=BB.ScanLine[Y];
 P21:=BB.ScanLine[Y-1];
 for X:=0 to Pred(BB.Width-2) do begin
 for C:=0 to 2 do
 begin
 U:=P0[(x*3)+C]-P1[((x+1)*3)+C];
 V:=P1[(x*3)+C]-P0[(x+1)*3+C];
 P2[(x*3)+c]:=Trunc(Sqrt(Sqr(U)+SQR(V)));
 
 //Порог (четыре уровня  )....
 CC:=0;
 IF P2[(x*3)+C] >Porog then CC:=255 else
 IF P2[(x*3)+C] >Porog div 2 then CC:=125 else
 IF P2[(x*3)+C] >Porog div 3 then CC:=85 else
 IF P2[(x*3)+C] >Porog div 4 then begin CC:=62;
 // Ловушка для одиночных пикселей
 if self.CheckBox4.Checked then
 if Not ((X>0) and ((P2[((x-1)*3)+C]
 +P2[((x+1)*3)+C]
 +P21[((x-1)*3)+C]
 +P21[(x*3)+C]
 +P21[((x+1)*3)+C]) div 5 > Porog div 4))then
 CC:=0;
 end
 end;
 if (cc<>0) then    for C:=0 to 2 do P2[(x*3)+c]:=CC;
 end;
 BB.EndUpdate(False);
 
 end;
 Clip.Free;Clip:=bb;
 end;
 
Код нуждается в оптимизации но работает ...
ЗЫ 
Извиняюсь за не внимательность ... Разуметься это фильтры  Робертса и Собела .. 
 Добавлено спустя 23 часа 22 минуты 1 секунду:
Добавлено спустя 23 часа 22 минуты 1 секунду:Кстати вот и он Фильтр  Собела...
(Надежд не оправдал да ярче но кривее, толще и мусорней  ) 
... или все-же где-то я сам  ляп пропустил  
 
   
 - Код: Выделить всё
- //Фильтр  Собела + Порог
 procedure Sobel(var Clip: TBitmap;Porog:Integer);
 Type
 BA=Array[0..1]of byte;
 var P0,P1,P02,P2,P21:^BA;
 X,Y,V,U,C,CC: integer;
 BB:TBitmap;
 begin
 BB:=TBitmap.Create;
 bb.PixelFormat:=pf24bit;
 bb.SetSize(Clip.Width,Clip.Height);
 for Y:=1 to BB.Height-2 do
 begin
 P1:=Clip.ScanLine[Y-1];
 P0:=Clip.ScanLine[Y];
 P02:=Clip.ScanLine[Y+1];
 BB.BeginUpdate(False);
 P2:=BB.ScanLine[Y];
 P21:=BB.ScanLine[Y-1];
 for X:=1 to BB.Width-2 do begin
 for C:=0 to 2 do
 begin
 U:= (P02[((x-1)*3)+C]+2*P02[(x*3)+C]+P02[((x+1)*3)+C])
 -(P1[((x-1)*3)+C]+2*P1[(x*3)+C]+P1[((x+1)*3)+C]);
 
 V:= (P1[((x-1)*3)+C]+2*P0[((x-1)*3)+C]+P02[((x-1)*3)+C])
 -(P1[((x+1)*3)+C]+2*P0[((x+1)*3)+C]+P02[((x+1)*3)+C]);
 
 P2[(x*3)+c]:=ABS(U)+ABS(V);
 // Trunc(Sqrt(Sqr(U)+SQR(V)));
 
 CC:=0;
 //Управляемый порог фильтра
 IF P2[(x*3)+C] >Porog then CC:=255 else
 IF P2[(x*3)+C] >Porog div 2 then CC:=125 else
 IF P2[(x*3)+C] >Porog div 3 then CC:=85 else
 IF P2[(x*3)+C] >Porog div 4 then begin CC:=62;
 // Ловушка для одиночных пикселей
 if self.CheckBox4.Checked then
 if Not ((X>0) and ((P2[((x-1)*3)+C]
 +P2[((x+1)*3)+C]
 +P21[((x-1)*3)+C]
 +P21[(x*3)+C]
 +P21[((x+1)*3)+C]) div 5 > Porog div 4))then begin
 CC:=0;
 end
 end ;
 end;
 if (cc<>0) then  for C:=0 to 2 do P2[(x*3)+c]:=CC;
 end;
 BB.EndUpdate(False);
 
 end;
 Clip.Free;Clip:=bb;
 end;
 
Добавлено спустя 21 час 53 минуты 49 секунд:
Детектор Канни (исходники на дельфи) обнаружен...
Сконвертирован в Лазарус (Если кто-то думает что там все делает автомат .. пусть он  так не думает !    )...
 )...
Исправлен ( ....интересно код там вообще рабочий был?     ) ...
 ) ...
Модифицирован (Цветное сглаживание и вообще более нормальная работа в RGB режиме  )...



 
  Detection_contour_Canny02.7z
 Detection_contour_Canny02.7z  
 Теперь еще нужно научится применять его на практике ...   
 Добавлено спустя 20 часов 23 минуты 13 секунд:
Добавлено спустя 20 часов 23 минуты 13 секунд:И так задумался я начнем бы мене простом потренироваться  в использовании всей это бездны премудрости и могущества...
Напрашивается старая идея-фикс распознавание маркеров (и что важнее  их положения в пространстве ) для дополненной реальности   . 
Вооружившись в качестве  дорожной карты  
 ЭТОЙ
 ЭТОЙ статьей .
Начал думать что мне взять за ПРОСТЕЙШИЙ маркер ?  ...и тут с верхней полки на меня упал ОН ! Кубик Рубика ! ... народ эврика !!!! 
 
 

Так что  задача проста : определить координаты хотя-бы одной грани и нарисовать "виртуальный кубик" поверх реального  !  
Вообще хорошо-бы повторить "подвиг програмера " и сделать AR-Мастер  сборки кубика ..

Но это сильно побочный квест ...
Отсюда вопрос : Что лучше  использовать  как образец ? Черную или белую табличку 3Х3 , набор квадратиков или просто отдельные квадратики (а кубик целиком определять по  их положению относительно друг друга )
Зы
Интересно это только мне кажется что нынешние поделки в области АР ну просто 
дико тупые ?
Ведь  и ежу понятно, что определив положение в пространстве даже всего одной метки можно развернуть целый виртуальный "рабочий стол" (Точнее рабочий ОБЪЕМ ) А качестве триди устройства устройства визуализация вполне может хватить обычного монитора   аниглиф очков (или затворных )  и "вывернутой   перспективы" (Это когда кажется что изображение висит перед экраном )...
В моем случае я думаю юзать простую связку из веб-сервера, смартфона и "кастрюли стереовизора "  

Данные с камеры сартфона на обработку  можно получать например вот так 
https://play.google.com/store/apps/deta ... bcam&hl=ruВзаимодействие с ДР можно сделать не менее  простым ... 
1 "3д курсор" 
2 или воспользовавшись чем-то вроде от этого с позволения сказать "девайса" ...


(Карандаш+ прищепка  +какой-нибудь маркер  )
Зы Зы
Ух разошелся я однако ... теперь в дело за "малым" написать что-то рабочие ...   
 
   
 ... и чувствую что почти "дозрел" до разборок с жутким  и тяжелым (как мне казалось еще недавно OpenCV )  ...  
