Eine wichtige frage ist of die Zeichen immer die gleiche Größe haben.
Dann sollte das nicht so schwer sein.
Wenn die größe variiert und die Zeichen noch unterschidliche ausrichtungen haben ( e.g. gedreht , gestaucht , andere Font , ... ) wird es richtig schwer.
Hier mal etwas C# Code wie man sehr schnell ( für C# ) ein Bild in einem Bild suchen kann.
Code:
public static bool SucheBildimBild(Bitmap grosseBild, Bitmap SuchBild, ref int Treffer_x, ref int Treffer_y)
{
Rectangle rec_grosseBild = new Rectangle(0, 0, grosseBild.Width, grosseBild.Height);
Rectangle rec_SuchBild = new Rectangle(0, 0, SuchBild.Width, SuchBild.Height);
BitmapData grosseBild_data = grosseBild.LockBits(rec_grosseBild, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
BitmapData SuchBild_data = SuchBild.LockBits(rec_SuchBild, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
unsafe
{
int remain1 = grosseBild_data.Stride - grosseBild_data.Width * 3;
int remain2 = SuchBild_data.Stride - SuchBild_data.Width * 3;
byte* ptr1 = (byte*)grosseBild_data.Scan0;
byte* ptr2 = (byte*)SuchBild_data.Scan0;
for (int y = 0; y < rec_grosseBild.Height; y++)
{
for (int x = 0; x < rec_grosseBild.Width * 3; x++)
{
if (ptr1[0] == ptr2[0])
{
// Der erste Treffer wurde gefunden
// jetzt werden die restlichen Zeichen verglichen
byte* ptr3 = ptr1;
byte* ptr4 = ptr2;
for (int y2 = 0; y2 < SuchBild.Height; y2++)
{
for (int x2 = 0; x2 < SuchBild.Width * 3; x2++)
{
if (ptr3[0] != ptr4[0])
{
goto endofLoop; // oh no, ein goto ... aus Geschwindigkeitsgründen ist das hier jedoch Sinnvoll.
}
ptr3++;
ptr4++;
}
ptr3 = ptr1 + grosseBild_data.Stride * (y2 + 1); // Genau eine Zeile nach unten springen
ptr4 += remain2;
}
// Wenn das Prog bis hier kommt, hatten wir einen Treffer
Treffer_x = x / 3;
Treffer_y = y;
return true;
}
endofLoop: // Sprungmarke, wenn es keinen Treffer gab ... Weiter mit dem nächsten pixel
ptr1++;
}
ptr1 += remain1;
}
}
grosseBild.UnlockBits(grosseBild_data);
SuchBild.UnlockBits(SuchBild_data);
return false;
}
Hierbei könnte man jetzt noch eine extra Logik einbauen , um überlappungen auch noch zu tollerieren. e.g. eine übereinstimmung von 75% langt.
Dabei solltest du aber berücksichtigen das die Übereinstimmung nicht nur im Hintergrund ist