|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Поиск изображения (цветовые каналы)
Программа "бот косынка" делает скриншот экрана, затем ищет в нем образец.
Находит на отлично, но бывает подводит... причина: в цветовых каналах, на глаз человека абсолютно одинаковые изображения. Как то возможно сделать одинаковыми изображения и для программы??? (пытался играть с тоном, но увы...) Код:
//код поиска скачен с иходников var buf1, buf2: TBuf; procedure LoagIMG(var buffer: TBuf; img: TImage; Name: String); var x,y,c: integer; p: pByteArray; begin img.Picture.LoadFromFile(Name); img.Picture.Bitmap.PixelFormat:=pf24bit; // pf8Bit; x:=0; y:=0; x:=0; SetLength(buffer, img.Height, img.Width); for y:=0 to img.Height-1 do begin p:=img.Picture.Bitmap.ScanLine[y]; for x:=0 to img.Width-1 do begin c:=((p[x*3+0] shl 8+p[x*3+1]) shl 8)+p[x*3+2]; buffer[y,x]:=c; end; end; end; function TForm1.CompareIMG: FRes; var y, x, yy, xx: integer; begin y:=0; repeat x:=0; repeat Result.found:=true; yy:=0; repeat xx:=0; repeat if buf1[y+yy, x+xx]<>buf2[yy,xx] then Result.found:=false; inc(xx); until (xx>=Image2.Width) or (Not Result.found); inc(yy); until (yy>=Image2.Height) or (Not Result.found); inc(x); until (x>Image1.Width-Image2.Width) or (Result.found); inc(y); until (y>Image1.Height-Image2.Height) or (Result.found); if Result.found then begin Result.x:=x-1; Result.y:=y-1; end; end; // Пример использования: type FRes = record found: boolean; x,y: integer; end; var FindResult: FRes; begin LoagIMG(buf1,Image1 ,'C:\Bot\Screen.bmp'); LoagIMG(buf2, Image2, 'C:\Bot\AB.bmp'); FindResult:=CompareIMG; if FindResult.found then ShowMessage('Нашел'); end; Последний раз редактировалось ryzveld, 05.11.2013 в 06:14. |
#2
|
|||
|
|||
1. Переводить изображение в ч/б, причем тут надо поиграться с уровнем, т.е. сколько %% должно быть, что бы точка стала черной. Я бы сказал, что можно с помощью любой библиотеки сделать 256 оттенков серого, а потом в ч/б (1 бит на точку) переводить самому.
2. Нечеткое сравнение. По контурам находишь образец, сравниваешь, потом, соответсвенно, принимаешь решение по кол-ву ошибок сравнения. Т.е. изображение может совпадать не полностью, а только процентов на 80. Уже достаточно точно. Потом просто "играешься" с БД картинок и выверяешь коэф. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
ryzveld (05.11.2013)
|
#3
|
|||
|
|||
Цитата:
1. У Вас случайно что нибудь подобное не имеется? Бессонные ночи в пытках не дают результата... Вожусь с вариантов нечеткое сравнение, но процент совпадания всегда разный. Начинаю считать\искать совпадение с [0,0] пксля фрагмента... 2. А можно пссчитать процент совпдения чз код предоставленный в исходниках? (код поиска в первом сообщении) |
#4
|
|||
|
|||
Цитата:
|
Этот пользователь сказал Спасибо x128 за это полезное сообщение: | ||
ryzveld (08.11.2013)
|