Что нового

поиск изображения в картинке

black1

C++,Pic
Сообщения
39
Репутация
0
Есть набросок кода, открываю bmp , и хочу найти в нем кусок другого bmp, получить координаты.

$hImage2 найти в $hImage1 и получить координаты
Код:
#include <ScreenCapture.au3>
   
   ; Инициализация библиотеки GDI+
    _GDIPlus_Startup ()
	
	   ;  Грузим изображение
    $hBitmap0 = _WinAPI_CreateBitmap(890, 1119, 1, 32)
    $hImage0 = _GDIPlus_BitmapCreateFromHBITMAP( $hBitmap0)
    $hImage1 = _GDIPlus_ImageLoadFromFile ('d:\tt.bmp')
	$hBrush1 = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
	
    $hImage2 = _GDIPlus_ImageLoadFromFile ('D:\logo.bmp')

    ; Рисует одно изображение в другом
	$nomer = "5"
    $hGraphics = _GDIPlus_ImageGetGraphicsContext ($hImage0)

   _GDIPlus_GraphicsDrawImage ($hGraphics, $hImage1, 0, 0)
   _GDIPlus_GraphicsDrawString($hGraphics, "test "&$nomer, 120, 30, "Arial", 16, 0)
 
 
  
    ; Сохраняет изображение в файл
    _GDIPlus_ImageSaveToFile ($hImage0,'D:\tt' &'2.bmp')
   ; _GDIPlus_ImageSaveToFile ($hImage0,'c:\' &$art &'.bmp')
  _GDIPlus_BrushDispose($hBrush1)
    ; Очищает ресурсы
    _GDIPlus_ImageDispose ($hImage1)
    _GDIPlus_ImageDispose ($hImage2)
    ;_GDIPlus_ImageDispose ($hImage2)
    _WinAPI_DeleteObject ($hBitmap0)
    ;_WinAPI_DeleteObject ($hBitmap2)
    _WinAPI_DeleteObject ( $hImage0)
    ; Закрывает библиотеку GDI+
    _GDIPlus_ShutDown ()




Добавлено:
Сообщение автоматически объединено:

по идеи надо по пиксельно как то.. может наброски есть похожие у кого.. или функции какие использовать
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Что-то каждый день про это спрашивают


Посмотри этот пример
http://autoit-script.ru/index.php?topic=12356.msg79842#msg79842
Две картинки, большая и маленькая, преобразовываем их в строки.
Потом ищем через StringInStr() строку пикселей из маленькой картинки в большой.
 
Автор
B

black1

C++,Pic
Сообщения
39
Репутация
0
ок, хммм гениально построчно искать, щя посмотрю
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
black1
У меня там правда косяк вроде в конце, где координаты считаются, немного ошибается
 
Автор
B

black1

C++,Pic
Сообщения
39
Репутация
0
WSWR
скинь пожалуйста пример рабочий.. с картинками ..а то на вскидку смотришь разный код картинок почемуто

с урл выше что то получается -1;228;322;-1;-1 CALCULATOR.BMP in SCREEN ** matchtype 1 time elapsed: 830.71083355622 milliseconds
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
black1
Выложи примеры картинок, что и где искать
так проще будет
 
Автор
B

black1

C++,Pic
Сообщения
39
Репутация
0
WSWR
прикрепил архив там 2 изображение примерно что имею

1.bmp у меня на картинке слова-буквы, вот если на картинке нашлось WWN(2.bmp) то над координаты где, и перерисую на другой символ..

может можно будет попробовать даже не координатами а строками заменить? или структура повредится картинки?


Добавлено:
Сообщение автоматически объединено:

на прошлой ссылке не скачал..тоже..
Ошибка!
Вы не можете зайти в этот раздел


Добавлено:
Сообщение автоматически объединено:

написано ошибка изза переездов.. выкладывать на другой хостинг
http://yadi.sk/d/gFX6PFEVGt5Ve


Добавлено:
Сообщение автоматически объединено:

омг похожий топик http://autoit-script.ru/index.php/topic,961.0.html посмотрю может решено..
 
Автор
B

black1

C++,Pic
Сообщения
39
Репутация
0
inververs
спасибо, красивый пример.. они берут скрин с экрана.. у меня файлы BMP.. пытаюсь прикрутить пока без результатно..
Код:
Local $hSource = _ScreenCapture_Capture('')     на $hBitmap = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\1.png')

был близок hbitmap сек
Код:
_GDIPlus_ImageLoadFromFile ('D:\logo.bmp')

далее ругается
Код:
"C:\Program Files\AutoIt3\Include\BmpSearch.au3" (46) : ==> Variable must be of type "Object".:
Local $iRowInc = ($tSizeSource.X - $tSizeFind.X) * 4
Local $iRowInc = ($tSizeSource.X - $tSizeFind^ ERROR
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
black1
Главное при таком способе правильно выбрать подстроку из маленькой картинки
У твоей маленькой картинки белые поля не обрезаны, поэтому лучше брать строку из середины
Код:
#include <GDIPlus.au3>

_GDIPlus_Startup()
$hBitmap = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\2.bmp')
$Width = _GDIPlus_ImageGetWidth($hBitmap)
$Height = _GDIPlus_ImageGetHeight($hBitmap)
$tMap = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $Width, $Height, $GDIP_ILMREAD, $GDIP_PXF32ARGB)
$bData1 = DllStructGetData(DllStructCreate('byte[' & ($Width * $Height * 4) & ']', DllStructGetData($tMap, 'Scan0')), 1)
_GDIPlus_BitmapUnlockBits($hBitmap, $tMap)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_Shutdown()
$bData1 = StringTrimLeft($bData1, 2)

$countstring = StringMid($bData1, $Width * 8 * Round ($Height / 2), $Width * 8) ;  берем строку пикселей, которая на середине маленькой картинки
;ConsoleWrite($countstring & @CR)

_GDIPlus_Startup()
$hBitmap = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\1.bmp')
$Width = _GDIPlus_ImageGetWidth($hBitmap)
$Height = _GDIPlus_ImageGetHeight($hBitmap)
$tMap = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $Width, $Height, $GDIP_ILMREAD, $GDIP_PXF32ARGB)
$bData2 = DllStructGetData(DllStructCreate('byte[' & ($Width * $Height * 4) & ']', DllStructGetData($tMap, 'Scan0')), 1)
_GDIPlus_BitmapUnlockBits($hBitmap, $tMap)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_Shutdown()
$bData2 = StringTrimLeft($bData2, 2)
;ConsoleWrite($bData & @CR)

For $i = 1 To 100
	$sTring1 = StringInStr($bData2, $countstring, 0, $i) - 1
	If $sTring1 > 0 Then
		$y = Ceiling($sTring1 / $Width / 8) - 1
		$x = ($sTring1 / 8 - $y * $Width)
		ConsoleWrite($x & ' ' & $y & @CR)
	Else
		ExitLoop
	EndIf
Next
 
Автор
B

black1

C++,Pic
Сообщения
39
Репутация
0

boosterbear

Новичок
Сообщения
1
Репутация
0
inververs сказал(а):
.../forum/topic/158264-bmpsearch-search-for-bitmap-within-bitmap-assembly-version
ТЫК BmpSearch
Стремно пользоваться этим модулем. Детально ковырять его времени нет, но модификация области памяти, в которой живет kernel32.dll как бы намекает...


Добавлено:
Сообщение автоматически объединено:

У кого-нибудь работает ImageSearch.au3 на Win7 x64?
 

ivanius

Знающий
Сообщения
74
Репутация
5
если поиск на экране могу помочь с этим, всегда пользуюсь вот этой прогой - ООООЧЕНЬ полезная штука для поиска обьектов:
UniqueColorsSearch2
https://sites.google.com/site/leaxplace/home
Реально крутая штука, если не поможет (не найдешь уникальные пиксели)
тогда путь брать любые 2-8 пикселей из маленькой картинки находить первый, проверять остальные, можно даже обычным пиксельсеачем и гетпиксель потом.
 
Верх