Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[Pomoc] C++ Szukanie obrazka


Rekomendowane odpowiedzi

Opublikowano

GetPixel(Obszar, pozycjaX, pozycjaY);

Jest to pobranie pixela z pozycji (X,Y) na Twoim Obszarze.

Zwraca Ci takie cudo jak ciąg liczb np 122101103 czy też 12210103, są to kolory (paleta RGB).

ustawiasz sobie inta w programie i sprawdzasz (np w paincie / gimpie) jakie liczby znajdują się przy R, G, B w palecie kolorów. dajmy na to:

R: 103

G: 99

B: 202

Wtedy twój int wygląda tak : int kolor_pixela = 10399202;

porównujesz z pobranym pixelem. Cóż, wiadomo że jeden piksel to za mało, musisz jakiś charakterystyczny kształt sobie wybrać i spisać wszystkie piksele (np 20 pikseli) porównujesz jeśli wszystkie 20 się zgadzają to jest to ten obrazek.

Weteran
Opublikowano

ustawiasz sobie inta w programie i sprawdzasz (np w paincie / gimpie) jakie liczby znajdują się przy R, G, B w palecie kolorów. dajmy na to:

R: 103

G: 99

B: 202

Wtedy twój int wygląda tak : int kolor_pixela = 10399202;

 

Funkcja może też po prostu zwrócić jeden kolor(tak jest praktyczniej)

 

@UrukioraPL

http://www.mpcforum.pl/topic/509599-tutgotowcerozne-przydatne-kody/page__p__3623840#entry3623840

punkt 3 - tam masz pokazane jak używać tej funkcji.

Opublikowano

Więc teraz tak:

 

GetPixel się raczej do tego nie nadaje ( znaczy można, ale po co ).

 

Wypada użyć GetDIBits, które kopiuje wszystkie piksele z danego regionu DC do bufora ( jednowymiarowa tablica )

http://msdn.microsoft.com/en-us/library/dd144879

 

Oszczędzi to dużo CPU i czasu.

 

Jedyny problem możesz mieć z drugim argumentem - kompatybilna bitmapa - tworzysz takową za pomocą CreateCompatibleBitmap

http://msdn.microsoft.com/en-us/library/dd183488

 

Co do pomocy albo TUTów, to tutaj step-by-step raczej nic nie otrzymasz, gdyż wszystko jest na MSDNie. Patrz: część Examples każdej funkcji, w szczególności

http://msdn.microsoft.com/en-us/library/dd183402

dla GetDIBits

 

 

Na koniec:

Mając bufor z bitami bitmapy, i mając "obrazek" na dysku, możesz go łatwo w podobny sposób wczytać do bufora, i porównać obydwa bit po bicie ( wyszukać jedno w drugim; jeśli zamiast bufora masz 2D array z bitami wprowadzanymi ręcznie, wyjdzie i tak dokładnie na to samo) :

 

found_needed = sizeof(bufor_szukany) / sizeof(bufor_szukany[0]) ; // na brudno, korzystania z sizeof w ogóle nie polecam
UINT found = 0; 

for ( /* y = 0 to wysokość */ 
for ( /* x = 0 to szerokość */ 
  if ( bufor_przeszukiwany[y*szerokosc_bitmapy+x] == bufor_szukany[found] ) 
    found++; 
  else if ( found == found_needed ) 
    found = -1;
    goto label1; // jebać 
  else
   found = 0;

label1: // tak, wiem
if ( found == -1 )
  uint obrazek_znajduje_sie_w_X = x - szerokosc_bitmapy; 
  // uint obrazek....Y = y - scanned_lines /* argument 4 GetDIBits */ 

 

To tak na bardzo brudno.

Ta sygnatura jest pusta.

Weteran
Opublikowano

Ale kto powiedział że program musi znać dokładnie cały obrazek? ;]

Wystarczy pobrać za pomocą GetPixel np. 50 pixeli po skosie i program ma już zarys szukanego obrazka i potem bez problemu może znaleźć ten obrazek, o którego nam chodziło, również pobierając pixele w taki sam sposób.

Opublikowano

No i właśnie dlatego nie powinniśmy używać GetPixel.

 

50-krotne wywołanie funkcji WinApi jest zdecydowanie dużo bardziej czasożerne, niż jednorazowe.

Ta sygnatura jest pusta.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...