Оптимизация сравнения двух изображений

Общие вопросы программирования, алгоритмы и т.п.

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

Re: Оптимизация сравнения двух изображений

Сообщение Лекс Айрин » 21.04.2019 16:09:28

Alex2013, так textOut рисует только на канвасе. Не, его можно и просто создать, без привязки к компоненту, только это будет бесполезно. Он тогда просто не будет отображаться.
У меня создаётся впечатление, что ты считаешь окном только стандартное окно винды. Но это не так. Окном может быть и обычная область экрана даже не ограниченная какими либо рамками. Ну или даже любая клякса по выбору программиста. Фактически, окном можно даже считать саму поверхность десктопа. Более того, можно, при особом желании, пользоваться даже системой без меню пуск и панели задач. Заодно и без всех значков рабочего стола. Для этого достаточно отредактировать один пункт реестра. Только это неудобно.
Не знаю правда, так ли это для десятки, но подозреваю, что да.
Все же, иди сам процесс. Анализ изображения, для поиска окна это как клеить обои через дверной зрачок. Профессионалу может и удастся, но времени явно будет потрачено больше. К тому же, представь ситуацию, когда другая прога начнет выкидывать аналогичное окно с совсем другой надписью?
Если уж ты решился, то, для пробы, сделай скрин экрана, а потом прогони его через программу распознавания текста. Вроде сейчас уже намного лучше, а раньше лично мне было проще перепечатать, так как ошибки исправлять в разы сложнее.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Оптимизация сравнения двух изображений

Сообщение Alex2013 » 21.04.2019 21:17:57

Окно может быть без рамок неправильной формы и даже кнопки которые TButton на самом деле "окна" но главное отличие в том что окна МОГУТ иметь ФОКУС и реагировать на стандартный набор событий . "считать саму поверхность десктопа" окном разумеется можно, но в любое окно можно влезть "не снимая сапог " Например просто получив "дисплейный контекст" (Что я кстати и делаю через ScreenDC:=GetDC(0); )

Но сам этот "кривой вывод" в окно(включая "окно" десктопа ) ОКНОМ НЕ БУДЕТ.
То есть я сам могу добавить в код всего одну строчку .
Код: Выделить всё
ExtTextOut(ScreenDC, 0,0 , ETO_OPAQUE, @R, 'Вам уже НЕ НУЖНО Нажимать Win-Y            ',60 , NIL);     


И это будет чуть более грубое повторение " вредного" транспаранта .... :) но окном это вот точно не будет ..
(Кстати, проверил работает .... :idea:)

Я почти уверен что транспарант сделан похожим образом (он точно один на всю систему и сообщает о блокировке стандартного управления от мышки клавиатуры, по сути у десктопа банально "отобрали фокус" )
Зы
К тому же, представь ситуацию, когда другая прога начнет выкидывать аналогичное окно с совсем другой надписью?
А знаешь представляю! Внезапно, сам похожую надпись вывел... Но суть в том, что транспарант появляется ПОВЕРХ всего прочего и низкоуровневый "хук на onPaint" обойти сложно . Да, вообще-то всегда могут быть любые непредвиденные случаи (Например кто-то умудрялся вообще программно отключить "обычный монитор" во время работы в WMR шлема) Понятное дело в этом варианте логика взаимодействия с интерфейсом винды будет вообще совсем другая . И если ты не заметил это даже не альфа а "Тестовая версия" (сделал что-то дал проверить жду отзывов "как вообще работает и работает ли вообще" - то что у меня что-то вроде работает еще не означает что работает у всех )

Но если утилита народ полностью устроит то я после косметической правки скажу волшебное слово "РЕЛИЗ" и займусь другими проектами. "Пруфы"? так мы за них ... :wink: Бо "у нас нет для вас других программистов !" :idea:
Alex2013
долгожитель
 
Сообщения: 3039
Зарегистрирован: 03.04.2013 11:59:44

Re: Оптимизация сравнения двух изображений

Сообщение Лекс Айрин » 21.04.2019 22:59:11

Alex2013, можно даже проще поступить и рисовать на канвасе рабочего стола без захвата контекста. Я так даже один раз случайно сделал. Но если используется низкоуровневый вывод прямо на рабочем столе, то ты попал. Хотя сомневаюсь. Что же, это тогда будет ещё одним аргументом против использования виртуала от Майкрософт.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Оптимизация сравнения двух изображений

Сообщение Alex2013 » 22.04.2019 00:22:23

1 Кроме " виртуала от Майкрософт" другого особенно и нет ... (Почти ВСЕ современные ВиАр-шлемы работают исключительно с софтом для винды ) А то что МS продвигает свой стандарт так он не лучше но и не хуже прочих . Я немного полазал по "соседним садам" благо WMR почти со всеми совместим ( а вот наоборот как бы нет, так что это точно нехилый ПЛЮС ) Так вот среди прочих только StreamVR и отчасти ОpenVR на чото-то похожи, а вот родной Oculus-у Rift-Core-2-0 ужос ужос ... ("Жрет как не в себя" ага типа "сингулярность вызывали ?" ) Да, я что понимаю у меня комп "ниже прожиточного минимума для ВиАр" и что это "поверх WMR" НО StreamVR тоже "поверх WMR", а ОpenVR (в зависимости от режима )еще и поверх StreamVR и ничего работает ... а Core у меня один раз "сожрало" даже кнопку выключения питания... причем "во втором режиме" то есть как-бы вообще аппаратное выключение (это вообще как ??! :shock: )

2 Про вывод через канвас :просто случайно способ захвата через контекст нашелся первым, а принцип " работает и ладно" никто не отменял...
Последний раз редактировалось Alex2013 24.04.2019 10:21:01, всего редактировалось 3 раз(а).
Alex2013
долгожитель
 
Сообщения: 3039
Зарегистрирован: 03.04.2013 11:59:44

Re: Оптимизация сравнения двух изображений

Сообщение Лекс Айрин » 22.04.2019 06:21:22

Alex2013, к сожалению, именно этот принцип и привел к текущей ситуации, когда 'и нести тяжело, и выкинуть жалко'.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Оптимизация сравнения двух изображений

Сообщение olegy123 » 23.04.2019 12:32:44

Alex2013 писал(а):2 Ну не я же "перелопачиваю несколько тысяч пикселей" а мой код (точнее CompareByte ) ты просто глянь в код программы
А теперь проведи тесты на скорость.
это все частное решение.
Diff некто не отменял, потом иногда нужно сравнивать два Diff - допустим засечь движения, область изменения.. всякие mpeg кодеки на это рассчитаны.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Оптимизация сравнения двух изображений

Сообщение Alex2013 » 23.04.2019 16:08:03

olegy123 писал(а):А теперь проведи тесты на скорость.

Скорость выполнения операции часто далеко не самое главное... (И сколько там "лопатить" то нужно? 25х1920х3... сравнить два массива на 144кб ? Пф!)
Суть в простоте реализации (хотя тут к тому же и ГАРАНТИРОВАННО быстрее - мерить что-то делаемое с помощью Canvas.Pixels с любым другим методом совершенно бессмысленно ) А вообще подобные фокусы сплошь рядом ! LCL почти всегда будет по множеству параметров проигрывать "чистому Win-Api" но писать программы с его помощью быстрее и удобней )
Зы
Мерить "скорость" Canvas.Pixels вообще нонсенс и даже более нормальные методы Canvas не слишком круты .
Посмотри на недавнее "побоище API" в теме :arrow: Быстрая отрисовка :idea: (На AlexByte не смотри это метод задуман как "хромой победитель" (типа "даже эта черепаха быстрее!" ) совсем уж "лежачих " AGG и GDIPlus. OpenGL предсказуемо в переди всех, а вот то что вторым идет OpenCV показывает резерв "байтового доступа" ведь там нет и не может быть ни какой другой методики рисования примитивов )

А что до сравнения монохромных изображений то CompareByte работает и с ними.
Последний раз редактировалось Alex2013 23.04.2019 17:10:30, всего редактировалось 4 раз(а).
Alex2013
долгожитель
 
Сообщения: 3039
Зарегистрирован: 03.04.2013 11:59:44

Re: Оптимизация сравнения двух изображений

Сообщение Лекс Айрин » 23.04.2019 16:25:17

Alex2013, если LCL ещё и будет выигрывать по скорости... Зачем тогда винда? Хотя теоретически можно сделать и алгоритм быстрее, если хранить изображение чисто как массив данных и самому писать парсер формата, задействуя и видеокарту. Но это будет уже не LCL, а просто своя библиотека модулей.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Оптимизация сравнения двух изображений

Сообщение Alex2013 » 23.04.2019 17:25:35

Лекс Айрин писал(а):Alex2013, если LCL ещё и будет выигрывать по скорости... Зачем тогда винда? Хотя теоретически можно сделать и алгоритм быстрее, если хранить изображение чисто как массив данных и самому писать парсер формата, задействуя и видеокарту. Но это будет уже не LCL, а просто своя библиотека модулей.


LCL МОЖЕТ выигрывать по скорости просто разработчики( что VCL, что LCL) не ставили это основной целью проекта. "Кол" чуть быстрее но он заточен под минимальный размер исполняемого кода с чем успешно справляется . А LCL как и VCL заточены под быструю и надежную разработку с чем тоже весьма успешно справляются.
Еще есть Light LCL и если она будет развиваться то вполне может стать SLLCL то есть Speed Light LCL . :idea:
Alex2013
долгожитель
 
Сообщения: 3039
Зарегистрирован: 03.04.2013 11:59:44

Re: Оптимизация сравнения двух изображений

Сообщение Лекс Айрин » 23.04.2019 18:26:12

Alex2013, в LCL упор в основном сделан на кроссплатформенность. Облегченные версии, если повезёт, могут стать основой новых версий основной ветки, тогда от них есть толк. А если они просто будут, без среды их использующейся то это лишь очередной мертворожденный проект. Впрочем, глянув я понял, что он уже мертв. Два года как.
LCL, это надстройка над WinAPI, и его аналогами для других осей, поэтому она не может быть быстрее. Основной его задачей является приведение вызовов функций к стандартному виду. За стандарт приняли Дельфи и Винду.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Оптимизация сравнения двух изображений

Сообщение Alex2013 » 23.04.2019 22:45:15

Разумеется,кроссплатформенность важна но в основе LCL лежит VCL и с этим бессмысленно спорить(вся идеология от туда ).
Лекс Айрин писал(а):LCL, это надстройка над WinAPI

А вот это не совсем так а кое где совсем не так ... ( Уже в VCL Очень многое реализовано или "в обход" или по иной идеологии и то WinAPI там мало чего осталась я уж молчу про кроссплатформенность LCL которая позволяет LCL работать там где никакого WinAPI вообще нет ) :idea:

Повторяю очень многое в LCL (и VCL) сделано иначе чем в WinAPI и часть быстрее !
Тот же канвас кроме тормозной "пиксельной матрицы" заслуженно держит третье место в соревновании API
(1-е место OpenGL 2-е место OpenCv(в качестве лучшего представителя "байтового доступа" ), дальше идет Canvas и с огромным пролетом в хвосте плетутся AGG, GDI и GDIplus (графическая основа WinAPI ) )
Да в WinAPI есть несколько методов работы с графикой отлаженных до "нереального блеска" ( на пример BitBlt ) но все сколько нибудь интенсивно использующие графику программы работают "в обход" всех прочих "стандартных" методов .
Alex2013
долгожитель
 
Сообщения: 3039
Зарегистрирован: 03.04.2013 11:59:44

Re: Оптимизация сравнения двух изображений

Сообщение Лекс Айрин » 24.04.2019 00:24:01

Alex2013, она далеко не лежит в основе. Она просто совместима.
Конечно, если сравнивать функции с поддержкой видеокарты и без, то первый вариант будет быстрее. Это все равно что сравнивать велосипед и мотоцикл. Толькоко ты забываешь один нюанс -- сейчас вся серьезная работа происходит на витеокарте. Не, можно и на проце делать, благо не очень то и маленькая скорость, но вот насчёт LCL попробуй докопаться до того места где они определяются... И там будет, вызов стандартных функ
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Оптимизация сравнения двух изображений

Сообщение Alex2013 » 24.04.2019 09:41:55

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

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

Код: Выделить всё
Function CompareBMP (B1,B2:TBitmap):Bool;
begin
Result:=False; If (B1<> Nil) and (B2<> Nil) then
if (B1.RawImage.DataSize>0) and (B1.RawImage.DataSize=B2.RawImage.DataSize) then
Result:= CompareByte(B1.RawImage.Data^,b2.RawImage.Data^,b1.RawImage.DataSize) = 0;
end;

Если есть, предложи свой,конкретная критика тоже приветствуется ... А разговор на тему "Тайны LCL" предлагаю перенести "в курилку" ... :idea: Точнее в САД :arrow: "Сад камней" или Тайны LCL (+ попытки улучшения )
Alex2013
долгожитель
 
Сообщения: 3039
Зарегистрирован: 03.04.2013 11:59:44

Re: Оптимизация сравнения двух изображений

Сообщение Лекс Айрин » 24.04.2019 13:25:39

Alex2013, вообще, нужно посмотреть, что именно тебе нужно. Если обнаружить надпись или окно поверх всех окон, то вполне возможно, что тебе будет проще не проверять все изображение, а проверить наличие краев. То есть взять на 1-2 пикселя дальше от области появления и проверить 4 маленьких квадратика на появление границы. Ну или появление определенного фона в тех же областях. Ты же не анализируешь ее содержимое, а тупо ждёшь появления картинки четко определенного размера по четко определенным координатам.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Оптимизация сравнения двух изображений

Сообщение sts » 24.04.2019 15:15:52

забавно что алгоритм автора наименее ресурсоемкий ну и подслеповатый, любой другой будет на порядок дороже но и более правильный.
могу посоветовать для StretchDraw (если винда) использовать GDI+ под старую винду или Direct2D, они, при возможности используют аппаратное ускорение.
sts
постоялец
 
Сообщения: 430
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Пред.След.

Вернуться в Общее

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

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

Рейтинг@Mail.ru