Szybkie wyszukiwanie bitmapy w bitmapie

Szybkie wyszukiwanie bitmapy w bitmapie
MI
  • Rejestracja: dni
  • Ostatnio: dni
0

Witam!

Na potrzeby automatyzacji pewnych czynności potrzebuję zlokalizować pewien obiekt na printscreenie. W zwiazku z tym, że potrzebuję to zrobić relatywnie szybko, pomyślałem o scanline. Chcę uniknać porównywania poszczególnych pixeli, a skupić się na porównywaniu obszaru pamięci jako całości. Znalazłem funkcję CompareMem, która by tą sprawę załatwiła. Problem napotkałem próbując wyciąć kawałek tablicy bajtów pod wskaźnikiem w1 PByteArray. Pobieram z printscreena wskaźnik w1 na tablicę o długości 1920pxkolory a następnie pobiorę z bitmapy szukanej wskaźnik w2 PByteArray o długości 25pxkolory. W jaki sposób sprawdzić czy w tablicy pod wskaźnikiem w1 zawiera sie tablica spod w2 za pomocą CompareMem? Chyba że do tematu zabieram się w ogóle od d**y strony...

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

CompareMem porównuje ciągły obszar pamięci z ciągłym obszarem pamięci. Duża bitmapa zapisana jest wierszami (lub kolumnami o ile ją przekręcisz) więc mała bitmapa mieszcząca się w niej nie jest fragmentem ciągłym.

MI
  • Rejestracja: dni
  • Ostatnio: dni
0

wiem, dlatego nie chcę porównywać całej bitmapy z całą bitmapą, tylko wycinek tablicy przechowującej wiersz dużej, z całą tablicą przechowującą wiersz małej. Problem - jak uzyskać wycinek wiersza duzej?

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

CompareMem(@WierszDużej[OdPunktuX],@WierszMalej[0],RozmiarWierszaMalej);
Ale chyba nie tędy droga.

MI
  • Rejestracja: dni
  • Ostatnio: dni
0

cóz, jestem otwarty na propozycję innej drogi. Nie myślałem, że to takie proste, kombinowałem z jakimiś rzutowaniami itp:) Jeśli masz pomysł na szybszy, bardziej wydajny algorytm, to byłoby bardzo miło. Bitmapy obie mają 24bity 1bajt na kolor

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

Wszystko zależy od tego czy chcesz wyszukać jedno wystąpienie jednej małej bitmapy w dużej bitmapie czy też:

  • kilka wystąpień jednej bitmapy
  • jedno wystąpienie kilku bitmap
  • kilka wystąpień kilku bitmap
MI
  • Rejestracja: dni
  • Ostatnio: dni
0

jedno wystąpienie. Potrzebuje znaleźć miejsce na ekranie, w którym mam symulować naciśnięcie myszki. program będzie miał do dyspozycji kawalek bitmapy, który musi znaleźc na ekranie i w to miejsce kliknąć. Z racji tego, że będzie to sekwencja kliknięć, dobrze by było, żeby czas wyszukiwania był nie większy niż 1s. Wyszukiwanie 1:1 czyli brak jakiejkolwiek tolerancji, mała bitmapa będzie dokładnym wycinkiem duzej. Brak jakiegokolwiek obrotu. W jednym momencie wyszukujemy w dużej bitmapie jedną małą. Wyszukiwanie kolejnej małej (kolejnego punktu w sekwencji kliknieć) będzie osobno, bo w wyniku pierwszego kliknięcia zmieni się zawartosć printscreena

PS. Dodatkowo dla przyspieszenia wyszukiwania można zapamiętac pozycję w której dana bitmapa została znaleziona poprzednio i rozpocząc wyszukiwanie w tym miejscu +- 50 px

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

W takim razie małą przekształcasz na tablicę na dzień dobry np przy starcie programu do postaci array[0..SmallHeight-1,0..SmallWidth-1]of TColor;
Wyniki scanline dużej bitmapy wpisujesz też do podobnej tablicy array[0..SmallHeight-1,0..BigWidth-1]of TColor;
Czyli tyle wierszy ile ma mała, przed wczytywaniem kolejnego wiersza trzeba wszystkie przesunąć albo zrobić bufor cykliczny.
No i w tablice sobie wyszukujesz.

MI
  • Rejestracja: dni
  • Ostatnio: dni
0

dzięki, działa poprawnie:)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.