Szybkie wyszukiwanie bitmapy w bitmapie

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...

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.

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?

0

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

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

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
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

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.

0

dzięki, działa poprawnie:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1