Тема: AHK: Определение цветовой гаммы картинки
0
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
0
Vicoriyan, просьба слишком расплывчатая. Чем не устраивает имеющийся пример от Strongest, и что непонятно?
0
У Strongest он запускает 3 файла, которые работают в одном потоке.
Три файла никак не могут работать в одном потоке. Это три разных процесса.
0
Для этого ничего делать не нужно. Просто запускаете файл, и он будет работать в своём отдельном процессе.
0
Тогда это уже вопрос к алгоритму работы файлов. Не всегда разделение работы на несколько процессов приведёт к уменьшению общего времени решения задачи. Поиск пикселей — ресурсоёмкая работа, возможно, когда несколько скриптов осуществляют её параллельно, процессору нехватает мощности, и время работы каждого скрипта увеличивается.
0
Значит, таковы особенности поиска пикселей. Я, честно говоря, этой задачей подробно не интересовался, не знаю, как она реализована в AHK.
Что это за поиск, который длится 2 минуты? Что конкретно ищется и где?
Vicoriyan, не следует цитировать предыдущее сообщение без особой нужды.
0
0
На низком уровне эта команда состоит из двух: взятие буфера экрана и взятие пикселя из буфера. Если вы вызываете PixelGetColor для каждого пикселя, то буфер экрана вы обновляете столько же раз, отсюда и время.
Чтобы так не делать, используйте функции.
Upd:
Писал, еще не видя ваш ответ, для pixelsearch это тоже справеливо, раз вызываете ее 1000 раз - экономия будет от 30 до 100 секунд.
0
Это не арифметическая задачка - распараллеливание тут ничем не поможет, потому что бытулочное горлышко в другом - в шине передачи данных м/у видеопамятью и основной.
О этом можно догадаться и глядя в диспетчер задач - скрипт не загружает ядро полностью = параллезация не поможет.
Кстати в xp или на семерке с классической темой видеопамять не выделена, там операции с пикселями на порядок быстрее.
Что делать иначе, я вам уже написал выше.
Каждый из этих пикселей должен находится в конкретных координатах относительно области поиска?
0
А зачем вы ищете несколько пикселей если они могут быть разбросаны как угодно, в чём логика соответствия?
0
Vicoriyan, Вы читали Важнейшие правила? Код должен быть обрамлён соответствующим тегом. Исправьте!
Я думаю, тут надо алгоритм нормальный придумать оценки этой теплоты и холода. Я так понимаю, он зависит от соотношения красного, зелёного и синего. Так что если вычислить, так сказать, средний пиксель, как среднюю температуру по больнице, то его и можно потом оценить.
Или подсчитать, сколько пикселей холодных и сколько тёплых. Тут нужен способ различать их в этом отношении.
YMP, так все давно придумано, кмк, тут просто велосипедим и костыляем по черному.
stealzy
Ну, в общем, выбор определяется тем, что более лень делать — гуглить и разбирать чужой алгоритм или придумывать свой. Мне обычно лень в чужом коде разбираться.
0
0
Кстати, как правильно будет выглядеть свой алгоритм variation?
V := 5 ; Variation
MatchColor := 0xddeeff ; Искомый цвет
MR := (MatchColor & 0xFF)
MG := (MatchColor & 0xFF00) >> 8
MB := (MatchColor & 0xFF0000) >> 16
ThisColor := 0xdaeafa
R := (ThisColor & 0xFF)
G := (ThisColor & 0xFF00) >> 8
B := (ThisColor & 0xFF0000) >> 16
If (MR - V <= R && MR + V >= R
&& MG - V <= G && MG + V >= G
&& MB - V <= B && MB + V >= B)
MsgBox Ok
MsgBox No
Помоему 80% пора перенести в новую тему - Сортировка пикселей по цвету.
serzh82saratov, там по ссылке упомянут Display_CompareColors() из Display.ahk.
[!] уже отправлен.
И вопрос, будет ли быстрее, если считать с картинки все пиксели по очереди, записать их в переменную, а потом сравнить с списком?
Откуда вы эти картинки берёте? Если из файлов, то почему оттуда и пиксели не брать? Если с экрана, то быстрее будет считать все пиксели в буфер один раз, а потом уже искать в нём ваши уникальные.
Кстати, в чём их уникальность?
Суть: - если пикселей определенного цвета больше, значит картинка соответствует поиску.
Что за определённый цвет, если у вас сотни цветов? По какому критерию вы их выбирали?
0
ИМХО пустая трата времени.
Я бы использовал сервисы определения капчи.
Надо отписаться в гугол, чтоб прикрыли баг с дорожными знаками.
0
Malcev Та просто попробовать свои силы и просто интересно. Решаешь проблему, что делаешь и за одно и учишься.
Тогда реальней пытаться чистить и распозновать аудио.
0
Gdip_BitmapFromScreen.
0
Вот так у меня экран (1920x1080) меньше чем за 2 секунды прочёсывает.
Возвращает массив в ARGB:
a := A_TickCount
SetBatchLines, -1
CoordMode, Pixel, screen
pixelArray :=[]
pToken := Gdip_Startup()
pBitmap := Gdip_BitmapFromScreen()
width := Gdip_GetImageWidth(pBitmap)
height := Gdip_GetImageHeight(pBitmap)
E1 := Gdip_LockBits(pBitmap, 0, 0, width, height, Stride, Scan0, BitmapData)
loop % width
{
A_Index_X := A_Index-1
loop % height
pixelArray[A_Index_X, A_Index-1] := Gdip_GetLockBitPixel(Scan0, A_Index_X, A_Index-1, Stride)
}
Gdip_UnlockBits(pBitmap, BitmapData)
Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken)
msgbox % A_TickCount - a
0
Он же сказал, возвращает массив pixelArray. А число это время работы в миллисекундах.
0
Если посмотреть описание функции Gdip_BitmapFromScreen, то там написано, что можно указать нужные координаты (x,y,w,h) для снимка:
SetBatchLines, -1
CoordMode, Pixel, screen
pixelArray :=[]
pToken := Gdip_Startup()
pBitmap := Gdip_BitmapFromScreen("100|0|50|150")
msgbox % width := Gdip_GetImageWidth(pBitmap)
msgbox % height := Gdip_GetImageHeight(pBitmap)
Gdip_LockBits(pBitmap, 0, 0, width, height, Stride, Scan0, BitmapData)
loop % width
{
A_Index_X := A_Index-1
loop % height
pixelArray[A_Index_X, A_Index-1] := Gdip_GetLockBitPixel(Scan0, A_Index_X, A_Index-1, Stride)
}
Gdip_UnlockBits(pBitmap, BitmapData)
Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken)
0
Как сохранить все найденные пиксели в текст?
А зачем?
0
А почему вы не хотите узнавать это в цикле вместо создания массива?
И функция Gdip_GetLockBitPixel(Scan0, A_Index_X, A_Index-1, Stride) возвращает формат ARGB.
Поэтому для скорости лучше свою базу пикселей перевести тоже в ARGB.
0
Функция PixelColor := Gdip_GetLockBitPixel(Scan0, A_Index_X, A_Index-1, Stride) возвращает цвет пикселя, находящийся в координатах A_Index_X и A_Index-1.
0
Скрипт сканирует все пиксели в цикле (вставил msgbox для наглядности):
loop % width
{
A_Index_X := A_Index-1
loop % height
msgbox % Gdip_GetLockBitPixel(Scan0, A_Index_X, A_Index-1, Stride)
}
0
0
Вы всегда можете проверить доходит ли скрипт до определенного места с помощью msgbox.
Если в цикле более чем 1 строка, то его следует обрамлять в фигурные скобки.
Зачем вам так нужно сохранять значения в файл я так и не понял.
Проверяйте в цикле:
loop % width
{
A_Index_X := A_Index-1
loop % height
{
if (Gdip_GetLockBitPixel(Scan0, A_Index_X, A_Index-1, Stride) = "your_color")
msgbox found
}
}
В фигурные скобки лучше обрамлять всегда. Это понимаешь после того, как несколько раз добавишь ещё одну команду, а скобки добавить забудешь.
serzh82saratov, там по ссылке упомянут Display_CompareColors() из Display.ahk.
[!] уже отправлен.
Где там?
АП:
Гугль помог, там тоже самое.
0
Гугловскую капчу ломать бесполезное занятие.
0
#include gdip.ahk
SetBatchLines, -1
CoordMode, Pixel, screen
pixelArray :=[]
pToken := Gdip_Startup()
pBitmap := Gdip_BitmapFromScreen("100|0|50|150")
width := Gdip_GetImageWidth(pBitmap)
height := Gdip_GetImageHeight(pBitmap)
Gdip_LockBits(pBitmap, 0, 0, width, height, Stride, Scan0, BitmapData)
loop % width
{
A_Index_X := A_Index-1
loop % height
{
pixelArray[A_Index_X, A_Index-1] := Gdip_GetLockBitPixel(Scan0, A_Index_X, A_Index-1, Stride)
var := Gdip_GetLockBitPixel(Scan0, A_Index_X, A_Index-1, Stride)
PrevFormat := A_FormatInteger
SetFormat, IntegerFast, H
FileAppend, %var%`n, potok-kod_2.ini
SetFormat, IntegerFast, % PrevFormat
}
}
Gdip_UnlockBits(pBitmap, BitmapData)
Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken)
Чтобы выполнить вашу задачу в файл записывать не надо.
Можно просто сделать 16 циклов, по количеству картинок и подсчитывать совпадения.
Но попробуйте с файлом, если вам так удобно - всё равно вы придете к тому, что обойти гугловскую капчу можно только с помощью ручного труда китайцев, и бросите эту затею.
0
Вставьте счетчик итераций:
SetBatchLines, -1
CoordMode, Pixel, screen
pixelArray :=[]
pToken := Gdip_Startup()
pBitmap := Gdip_BitmapFromScreen("100|0|50|150")
width := Gdip_GetImageWidth(pBitmap)
height := Gdip_GetImageHeight(pBitmap)
Gdip_LockBits(pBitmap, 0, 0, width, height, Stride, Scan0, BitmapData)
loop % width
{
loop % height
{
a++
}
}
Gdip_UnlockBits(pBitmap, BitmapData)
Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken)
msgbox % a
0
Может я иду не по правильному пути и можно это все организовать проще? все может быть. Я тока изучаю autohotkey и естественно будут грубые ошибки и дурные вопросы.
При чём здесь AutoHotkey? Сюжет романа не зависит от того, на каком языке вы его напишете. Если сюжет скучный, то пишите хоть на каком языке, никто роман покупать не будет. В этом отличие алгоритма от его реализации.
0
Ага. Ещё спросите: где я и кто все эти люди?
0
Vicoriyan, гуглите алгоритм: street sign detection.
0
Vicoriyan, предложения должны начинаться с заглавной буквы и заканчиваться точкой. Исправьте!
http://forum.script-coding.com/viewtopi … 47#p118347
http://forum.script-coding.com/viewtopi … 65#p118365
http://forum.script-coding.com/viewtopi … 62#p118462
http://forum.script-coding.com/viewtopi … 73#p118473
http://forum.script-coding.com/viewtopi … 93#p118493
http://forum.script-coding.com/viewtopi … 01#p118501
http://forum.script-coding.com/viewtopi … 14#p118514
http://forum.script-coding.com/viewtopi … 26#p118526
http://forum.script-coding.com/viewtopi … 26#p118526
http://forum.script-coding.com/viewtopi … 53#p118553
http://forum.script-coding.com/viewtopi … 53#p118553
http://forum.script-coding.com/viewtopi … 59#p118559
http://forum.script-coding.com/viewtopi … 59#p118559
http://forum.script-coding.com/viewtopi … 69#p118569
http://forum.script-coding.com/viewtopi … 69#p118569
http://forum.script-coding.com/viewtopi … 71#p118571
http://forum.script-coding.com/viewtopi … 86#p118586
0
На исправления три дня.
Удаляйте тему. Она никаму не интересна, а меня тока дураком выставляет.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться