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 секунду:Кстати вот и он Фильтр Собела...
(Надежд не оправдал да ярче но кривее, толще и мусорней )
... или все-же где-то я сам ляп пропустил
- Код: Выделить всё
//Фильтр Собела + Порог
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 Теперь еще нужно научится применять его на практике ...
Добавлено спустя 20 часов 23 минуты 13 секунд:И так задумался я начнем бы мене простом потренироваться в использовании всей это бездны премудрости и могущества...
Напрашивается старая идея-фикс распознавание маркеров (и что важнее их положения в пространстве ) для дополненной реальности .
Вооружившись в качестве дорожной карты
ЭТОЙ статьей .
Начал думать что мне взять за ПРОСТЕЙШИЙ маркер ? ...и тут с верхней полки на меня упал ОН ! Кубик Рубика ! ... народ эврика !!!!
Так что задача проста : определить координаты хотя-бы одной грани и нарисовать "виртуальный кубик" поверх реального !
Вообще хорошо-бы повторить "подвиг програмера " и сделать AR-Мастер сборки кубика ..
Но это сильно побочный квест ...
Отсюда вопрос : Что лучше использовать как образец ? Черную или белую табличку 3Х3 , набор квадратиков или просто отдельные квадратики (а кубик целиком определять по их положению относительно друг друга )
Зы
Интересно это только мне кажется что нынешние поделки в области АР ну просто
дико тупые ?
Ведь и ежу понятно, что определив положение в пространстве даже всего одной метки можно развернуть целый виртуальный "рабочий стол" (Точнее рабочий ОБЪЕМ ) А качестве триди устройства устройства визуализация вполне может хватить обычного монитора аниглиф очков (или затворных ) и "вывернутой перспективы" (Это когда кажется что изображение висит перед экраном )...
В моем случае я думаю юзать простую связку из веб-сервера, смартфона и "кастрюли стереовизора "
Данные с камеры сартфона на обработку можно получать например вот так
https://play.google.com/store/apps/deta ... bcam&hl=ruВзаимодействие с ДР можно сделать не менее простым ...
1 "3д курсор"
2 или воспользовавшись чем-то вроде от этого с позволения сказать "девайса" ...
(Карандаш+ прищепка +какой-нибудь маркер )
Зы Зы
Ух разошелся я однако ... теперь в дело за "малым" написать что-то рабочие ...
... и чувствую что почти "дозрел" до разборок с жутким и тяжелым (как мне казалось еще недавно OpenCV ) ...