Bilder erkennen

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von SAR-71.

    Bilder erkennen

    Moin,

    wie kann ich Bilder vergleichen oder noch besser noch erkennen?
    Ich hab zb. eine Karte (Meinetwegen Herz Dame), diese Karte liegt mir als Bild vor auch schon alles in der Anwendung
    Nun will ich aber mit der Anwendung erkennen, dass es die Herz-Dame ist, wie kann ich das am besten machen?

    Konnte bisher leider nichts brauchbares zum Thema finden





    Mfg.
    SAR
    Bild mit einer Schleife in eine 2-Dimensionale Array packen. Beim Datentyp müsstest du schauen.. Byte müsste passend sein. Bei S/W-Bildern kann man auch Boolean nehmen.
    Wenn du beide Bilder als Array hast, kannst du sie dann vergleichen. (Mit verschachtelter Schleife durchlaufen)

    Hört sich verdammt nach nem AntiCaptcha an.
    Von meinem iPhone gesendet
    Geht in die Richtung, ist aber nicht der eigentliche Zweck
    Das Ganze soll andere Programme übersetzen (Hab jetzt ein Programm, in dem Labels sind, aber in Russischen Buchstaben)


    Und wenn man das jetzt so macht, dass man jeden Byte vergleicht (Und das pro Buchstabe), dass die Performance im Ar*** ist
    Gibt es nicht eine perfomantere Lösung? :P





    Mfg.
    SAR
    Naja, es geht eig.
    So lange ein Byte ja nicht korrekt ist, kannst du ja abbrechen. Bei Buchstaben kommt das relativ früh.

    Wenn du Programme übersetzen willst, was ist dann mit de Grammatik?
    Von meinem iPhone gesendet
    Das ist mir realativ egal
    Wenn ich da russische Zeichen sehe, dann versteh ich nur Bahnhof, aber wenn ich wenigstens deutsche Wörter sehe, dann kann ich mir den Rest zusammen reimen

    Grade habe ich ein anderes Problem: Die Texte haben hin und wieder ne andere Farbe und sind dann nichtmehr lesbar
    Wie kann das lösen?







    Mfg.
    SAR
    In dem Falle wäre eine Boolean-Array wohl doch besser. Die sind dann auch farbunabhängig.
    Bei Hintergrundfarbe: False, bei anderer: True. Dann könnte man noch eine Standardabweichung einbringen, da Schrift ja oft geglättet wird.
    hier kleiner Ansatz:

    VB.NET-Quellcode

    1. dim hintergrundfarbe as color = me.backgroundcolor 'zum Beispiel
    2. dim bmp_array(bmp.width-1,bmp.height-1)
    3. for x as integer = 0 to bmp.width-1
    4. for y as integer = 0 to bmp.height-1
    5. dim c as color = bmp.getpixel(x,y)
    6. if c = hintergrundfarbe then
    7. bmp_array(x,y) = false
    8. else
    9. bmp_array(x,y) = true
    10. end if
    11. next
    12. next
    (nicht getestet)
    Dann brauchst du nur noch die Boolean-Array aus deinen Bildern. (Kannst du genauso erzeugen)
    Allerdings ist es mit der SetPixel()-Methode etwas langsam; evtl. Lockbits verwenden. (Oder Kevin89s FastGraphicsLib, findest du im Showroom)
    Letztendlich vergleichst du die Arrays.
    Von meinem iPhone gesendet
    Ich hatte so etwas ähnliches mal gemacht um Wetterdaten von einem Bild auszulesen.
    Am Einfachsten ist es, wenn die Zeichen den gleichen Abstand zu einander haben.
    Andernfalls musst du immer den Anfang des nächsten Zeichens suchen.

    Dann musst du dir prägnante Punkte der Buchstaben überlegen, die nur
    bei diesem Buchstaben vorkommen. Oder auch solche Abfragen wie:
    Ist über dem jetzigen Pixel auch ein schwarzes Pixel? Und rechts zwei
    Pixel weiter auch? etc

    Damals hatte ich mir extra ein Hilfsprogramm geschrieben, mit dem ich
    das Bild vergrößert darstellen konnte. So war ich besser in der Lage die einzelnen
    Pixel abzuzählen. Am Schluss ging das Erkennen eigentlich ganz fix.
    Das wäre deutlich perfomanter als nikeee13's Methode
    Abzählen ist auch nicht das Problem, nur der Pixelvergleich

    Gibt es eine vorgefertigte Funktion oder muss ich mir das in Bytes umrechnen um es dann vergleichen zu können?

    "Ist Pixel5 von Bild1 schwarz, dann ..."
    Wie würde das als Code aussehen?






    Mfg.
    SAR

    SAR-71 schrieb:

    Das wäre deutlich perfomanter als nikeee13's Methode
    Abzählen ist auch nicht das Problem, nur der Pixelvergleich

    Gibt es eine vorgefertigte Funktion oder muss ich mir das in Bytes umrechnen um es dann vergleichen zu können?

    "Ist Pixel5 von Bild1 schwarz, dann ..."
    Wie würde das als Code aussehen?

    Im Grunde das gleiche, mit dem unterschied, dass er keine Arrays von Bereits vorhandenen Bildern generieren würde. (Sonder selbst welche Definiert)
    Von meinem iPhone gesendet
    Kann ich das Byte-Array irgendwie in eine ansatzweise "lesbare" Form bringen?

    Ich habe hier meine Funktion, die das Bild in ein Byte-Array umwandelt
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Function translate(ByVal Bild As Image) As Byte()
    2. Dim ms As New IO.MemoryStream
    3. Dim bild1 As Image = Image.FromFile(ofd.FileName)
    4. bild1.Save(ms, Drawing.Imaging.ImageFormat.Bmp)
    5. ms.Flush()
    6. Return ms.ToArray
    7. End Function


    Dieses Byte-Array will ich so konventieren, dass ich lesen kann um die "Schlüsselpixel" (Die, die zeigen, dass das der Text jetzt zb. "a" ist) im Programmcode zu speichern um sie dann alle vergleichen zu können

    Zu Testzwecken benutze ich eine einfache Msg-Box ("MsgBox(Convert.ToBase64String(translate(b)))"), jedoch taucht diese Msg-Box nicht auf, die wird einfach übersprungen und es geht mit dem Rest weiter







    Mfg.
    SAR
    Return ms.ToArray = böse
    du solltest das ganze eigt. auch aus dem Speicher löschen und auch schließen...
    außerdem beziehst du dich in der Funktion auf einen Pfad statt auf die übergebene Bild Variable...

    und nochmals außerdem ist dieser ByteArray nich für einen Bildvergleich gedacht, guck dich doch mal nach der LockBits Methode um ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Durch das Suchen über LockBits bin ich auf eine andere Methode gestoßen und zwar "GetPixel"
    Dauert zwar 50ms, aber es funktioniert und ich muss das Bild nicht zerschnippeln

    Ich lese den RGB einzelner Pixel(Die "Schlüssel-Pixel") aus, aber nun wollte ich mir Werte vordefinieren
    Aber die Werte die ich mit GIMP auslese unterscheiden sich bis zu 3 Farbstufen (RGB aus Programm: "12;8,9" , von GIMP: "15;6;9")

    Ist das normal (Also eine einfache Messungenauigkeit) oder muss ich noch irgendwas beachten (Ja, es sind die gleichen Pixel ;))


    Abgesehen von meiner Frage ist das Thema gelöst






    Mfg.
    SAR
    soweit ich weiß nimmt Gimp beim Pipeppentool den Pixel vom Bildschirmbild(deshalb kann man auch die Farbe aus anderen Controls grabben...) wahrscheinlich wird das Fenster bei dir, bei deaktivierung etwas abgedunkelt? Ich hatte auch schon probleme mit diesen Farbwerten in Gimp, die sich je nach art der Selektion(über die VG/BG Farbe, oder über das Pippetentool aus der Werkzeugliste...

    achja und für LockBits kann man sich theoretisch ganz einfach eine Get/SetPixel Methode nachbauen und das ganze ist nachher trotzdem um einiges schneller...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    jvbsl schrieb:

    achja und für LockBits kann man sich theoretisch ganz einfach eine Get/SetPixel Methode nachbauen und das ganze ist nachher trotzdem um einiges schneller...

    Falls du dazu keine Lust hast:
    [Beta] FastGraphicsLib 1.0.0.5
    Von meinem iPhone gesendet