Bildbereich mit einer Picturebox vergleichen

  • .NET (FX) 4.5–4.8
  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Bildbereich mit einer Picturebox vergleichen

    Hallo,

    ich möchte einen bestimmten Bereich des Bildschirms mit einer Picturebox1 vergleichen auf übereinstimmung.
    Sobald es übereinstimmt soll der Pc einen Beep Ton ausgeben.

    Leider habe ich es bisher nicht geschafft.

    Evtl kann man den Bildschirmbereich auch direkt mit dem Bild von der Festplatte vergleichen, statt mit der Picturebox.

    Über Hilfe würde ich mich freuen!

    mfG Danny 80 :|

    Verschoben. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    @Danny80 Willkommen im Forum. :thumbup:
    Kannst Du bitte noch mal genau beschreiben, was mit wem verglichen werden soll?
    Soll der Inhalt eines kleinen Bildes in einem großen Bild gefunden werden?
    Müssen Bildinhalt, Helligkeit, Größe übereinstimmen oder kann es da Toleranzen geben?
    ====
    Ein Bild, mit dem gearbeitet werden soll, muss stets in den RAM geladen werden.
    Und:
    BMP, PNG sind "richtige" Bilder, beim JPG wird der Bildinhalt durch verlustbehaftete Komprimierung verändert!
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo,

    also ich habe ein kleines Bild vom Display Screenshot temp auf der Festplatte gespeichert im Format .JPG.
    Es ist 100 pixel breit und 50 pixel hoch.
    Dieses Bild soll nun mit den Koordinaten x1550 y765 des PC Bildshirms verglichen werden mit der gleichen höhe und breite.

    Sobald dieser Bereich des Bildschirms übereinstimmt soll der PC ein Beep Signal ausgeben.

    Ich hoffe das war verständlich erklärt. Es soll möglichst rechnerschonend arbeiten, da die prüfung durchgehend sein soll in einer timer box am besten die ca alle 500 ms prüft. Ggf kann ich auch ein anderes bildformat nehmen wenn es damit besser geht.

    mfG Danny 80
    @Danny80 Am besten Du beschreibst mal das eigentliche Problem / die Aufgabenstellung. Ob dann n x m Pixel und an den Koordinaten x und y ist nebensächlich.
    JPG wäre dann suboptimal.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo, ich dachte das hätte ich.

    Also ich habe ein Bild gespeichert das 100x50 pixel groß ist. Dieses Bild habe ich vom Desktop als Screenshot erstellt. Von einer bestimmten Internetseite.
    Nun soll mein PC anschlagen sobald dieses Bild auf der Webseite bzw Destop auftaucht.

    War das nun verständlich genug?

    mfG Danny80 ?(

    Danny80 schrieb:

    ich dachte das hätte ich.
    Nö, das ist die 2. Folgerung aus der ursprünglichen Anforderung.
    Manche Programmierer beschreiben ihr fetsgefressenes "Klein-Klein"-Problem und haben hierbei das Große und Ganze aus den Augen verloren.
    Wenn man dieses aber sieht ist es denkbar, dass das eigentliche Problem anders und wesentlich eleganter gelöst werden kann.
    Also: Warum musst Du wissen, ob da ein Bild auftaucht?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany Ich kann ehrlich gesagt deine Nachfragen auch nicht verstehen. Der Threadersteller hat sein Anliegen in meinen Augen schon im 1. Post ausreichend dargelegt.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    @Marcus Gräfe,

    ich danke Dir für deine Lösungsansätze und werde mal versuchen damit was zu machen.
    ich habe hier noch das gefunden https://www.vb-paradise.de/index.php/Thread/14604-bilder-vergleichen-motiondetection-realisieren-update/

    Viellecht ist das die Lösung.

    @'RodFromGermany
    Das Programm was ich entwerfe soll den Bildschirm überwachen, bis ein Bild erscheint auf der Webseite.
    Ich entwerfe eine Bilderkennungssoftware die zb ein Werbefenster, erkennen kann und autom. schließen kann zb.

    mfG Danny80
    @Danny80 Geht doch. ;)
    Also so ne Art Werbeblocker.
    Das mit dem BitmapData ist die richtige Herangehensweise. Probleme sehe ich noch mit Deiner 500 ms-Taktung. 1000 ms sollten da ggf. reichen, aber das musst Du ausprobieren.
    Das hängt insbesondere auch davon ab, was sonst noch so für Programme auf dem Rechner laufen und was das halt für ein Rechner ist.
    Wenn Du Dich mit C# anfreunden könntest, kannst Du dort schnellen unsafe Code schreiben, indem Du mit je einem Pointer direkt auf den Speicher zugreifst, das hat die höchste Performance:

    C#-Quellcode

    1. BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);
    2. IntPtr ptr = bmpData.Scan0;
    3. unsafe
    4. {
    5. byte* pixel = (byte*)ptr.ToPointer();
    6. // Schleife über alle Pixel
    7. {
    8. // mit *pixel was tun
    9. pixel += 4; // nächstes Pixel (bei 4 Byte pro Pixel)
    10. }
    11. }
    12. bmp.UnlockBits(bmpData);
    pixel ist der Pointer auf den Speicher, *pixel ist der Speicherinhalt an der betreffenden Stelle
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Jo, das wird aber noch sehr knifflig. Also selbst wenn die Bilder bis ins letzte pixel übereinstimmen (etwa, indem du das unerwünschte Bild vom Bildschirm kopierst und speicherst, um dann alle Fenster mit diesem Bild zu "bannen") braucht man noch immer einen listigen Wieder-Erkenn-Algo, der jedesmal den gesamten Screen durchsuchen muss - alle Pixel.
    Performant wäre, zunächst nach genau dem ersten Pixel zu suchen, und bei Treffer, das 2, usw. die erste Pixel-Zeile durch.
    Wenn die erste Zeile durch ist muss der Algo iwie umschalten, sodass im folgenden nicht mehr der ganze Screen gescannt wird, sondern nur senkrecht unter der bislang gefundenen Pixel-Strecke.

    Das wäre eine Strategie, es sind auch weitere denkbar, evtl. was mit Einschränkung des Screens aufs Topmost-Windows, oder überhaupt erst aufs Aufpoppen eines neuen Windows reagieren etc..
    Also richtig was für Hirnschmalz aufkochen ;)