Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > .NET Languages
You last visited: Today at 16:43

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Bilder vergleichen

Discussion on Bilder vergleichen within the .NET Languages forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Jan 2015
Posts: 6
Received Thanks: 0
Bilder vergleichen

Hi,

da ich im Internet nichts passendes finden konnte, muss ich nun doch einen Thread erstellen.

Wie kann ich meinem Programm sagen, dass er auf meinem Bildschirm(wenn möglich auch in einem bestimmten bereich) nach einem Bild(welches auf meiner Festplatte liegt) suchen soll und wenn er dieses Bild gefunden hat, dann soll er mir die Koordinaten vom gesuchten Bild ausgeben.


Sorry wenn diese Frage auf epvp schon beantwortet wurde und ich den Thread nicht finden konnte.

Ich hoffe mir kann einer helfen.
Danke und Grüße
doromoro is offline  
Old 10/11/2015, 19:27   #2
 
elite*gold: 0
The Black Market: 113/0/2
Join Date: Oct 2014
Posts: 669
Received Thanks: 41
Koordinate = Pfad?

Welche Sprache?
8lol823 is offline  
Old 10/11/2015, 20:06   #3
 
elite*gold: 0
Join Date: Jan 2015
Posts: 6
Received Thanks: 0
C#.
Dort wo sich das Bild auf meinem Bildschirm befindet, z.B. x=620, y=420
doromoro is offline  
Old 10/11/2015, 20:17   #4
 
.SkyneT.'s Avatar
 
elite*gold: 273
Join Date: Sep 2010
Posts: 1,831
Received Thanks: 786
Du könntest das ganz einfach selber programmieren indem du jeden Pixel der beiden Bilder vergleichst, jedoch ist das extrem langsam, desswegen würde ich in dem Fall einfach zu OpenCV (bzw. in c# emgu cv) greifen. Dort gibt es die MatchTemplate() Funktion welche ein Bild in einem anderen sucht.
(Bisschen googeln, dann findest du sicher ein paar Beispiele dafür)
.SkyneT. is offline  
Thanks
1 User
Old 10/11/2015, 20:44   #5
 
elite*gold: 8
Join Date: Sep 2014
Posts: 625
Received Thanks: 177
Quote:
Originally Posted by .SkyneT. View Post
Du könntest das ganz einfach selber programmieren indem du jeden Pixel der beiden Bilder vergleichst, jedoch ist das extrem langsam, desswegen würde ich in dem Fall einfach zu OpenCV (bzw. in c# emgu cv) greifen. Dort gibt es die MatchTemplate() Funktion welche ein Bild in einem anderen sucht.
(Bisschen googeln, dann findest du sicher ein paar Beispiele dafür)
Die wird nicht viel schneller sein, wenn man es nicht naiv implementiert. Template-Matching Algorithmen sind nicht schwer zu implementieren, wenn man sich damit auseinandergesetzt hat. Aber zu einer fertigen Bibliothek zu raten, ist sicherlich keine schlechte Idee.
qqdev is offline  
Old 10/11/2015, 21:11   #6
 
.SkyneT.'s Avatar
 
elite*gold: 273
Join Date: Sep 2010
Posts: 1,831
Received Thanks: 786
Quote:
Originally Posted by qqdev View Post
Die wird nicht viel schneller sein, wenn man es nicht naiv implementiert. Template-Matching Algorithmen sind nicht schwer zu implementieren, wenn man sich damit auseinandergesetzt hat. Aber zu einer fertigen Bibliothek zu raten, ist sicherlich keine schlechte Idee.
Natürlich kann man das auch selber schreiben, es ist auch nicht unbedingt "schwer" und bestimmt eine gute Übung, wenn man jedoch vorankommen will, kann ich es mir sparen das alles hier:

noch einmal zu implementieren
.SkyneT. is offline  
Old 10/11/2015, 21:22   #7
 
elite*gold: 8
Join Date: Sep 2014
Posts: 625
Received Thanks: 177
Mir ging es nur um das "extrem langsam". Das ist nämlich falsch gewesen
qqdev is offline  
Old 10/11/2015, 22:48   #8
 
elite*gold: 0
Join Date: Mar 2010
Posts: 360
Received Thanks: 132
Auch hier kann ich den Boyer-Moore Algorithmus empfehlen... irgendwie kann man den für ne ganze Menge an Problemen nutzen.

Das Alphabet ist hier 0x00 bis 0xFF
Benötigt werden also zwei Arrays mit einer Größe von jeweils 255 (0xFF)
Der eine Array ist für die good-suffix Strategie, der andere für die bad-prefix Strategie
Verglichen werden die Hex-Werte von hinten nach vorne.
Wenn das aktuelle Zeichen c zu keinem Match führt, wird die maximale Distanz MAX(goodSuffix[c],badPrefix[c]) übersprungen und der Match-Vorgang beginnt von vorne.
Daifoku is offline  
Thanks
1 User
Old 10/11/2015, 23:53   #9
 
elite*gold: 8
Join Date: Sep 2014
Posts: 625
Received Thanks: 177
^ Das musst du nochmal genauer erklären. Was ist ein Match? Wie kommst du an die Koordinaten?
qqdev is offline  
Old 10/12/2015, 00:18   #10
 
elite*gold: 0
Join Date: Mar 2010
Posts: 360
Received Thanks: 132
Quote:
Algorithmus[Bearbeiten]
Das Muster wird am Anfang linksbündig unter den Text geschrieben und dann von rechts nach links Zeichen für Zeichen mit dem Text verglichen. Sobald ein Mismatch auftritt, berechnen zwei Heuristiken, wie weit das Suchmuster nach rechts verschoben werden kann.

Bad-Character-Heuristik
Stimmt beim Vergleich des Musters mit dem Text von rechts nach links ein Zeichen des Musters nicht mit dem Zeichen des Textes überein („Bad-Character“), wird im Muster nach dem letzten Vorkommen dieses Bad-Characters gesucht und das Muster soweit verschoben, bis beide Buchstaben übereinander liegen. Existiert dieser Bad-Character nicht im Muster, wird das Muster um seine volle Länge nach rechts verschoben. Es kann vorkommen, dass die Bad-Character-Heuristik eine Verschiebung des Musters nach links vorschlägt. In diesem Fall wird um eine Position nach rechts geschoben.
Good-Suffix-Heuristik
Stimmt beim Vergleich des Musters mit dem Text von rechts nach links ein Suffix des Musters mit dem Text überein und tritt danach aber ein Mismatch auf, wird das Muster soweit nach rechts geschoben, bis ein Teilwort des Musters wieder auf das Suffix passt. Existiert das Suffix kein zweites Mal im Muster, wird das Muster um seine volle Länge nach rechts verschoben.
Es kommt vor, dass die beiden Heuristiken unterschiedliche Verschiebungen berechnen. Der Algorithmus wählt immer das Maximum der beiden Vorschläge, um das Muster nach rechts zu verschieben.

Um das Vorgehen effizient zu gestalten, wird für beide Heuristiken in einem Vorverarbeitungsschritt jeweils eine Sprungtabelle errechnet. Die Sprungtabelle für die Bad-Character-Heuristik enthält für jedes im Suchmuster vorkommende Zeichen den Abstand von der Position des letzten Vorkommens im Suchmuster bis zum Ende des Suchmusters. Die Tabelle für die Good-Suffix-Heuristik enthält für jedes Teilmuster (von hinten aus gesehen) den Abstand vom Ende des Musters, ab dem es wieder im Muster vorkommt. Eine detailliertere Beschreibung des Algorithmus findet sich im entsprechenden Artikel in der englischen Wikipedia.
https://de.wikipedia.org/wiki/Boyer-Moore-Algorithmus

Die Koordinaten kann man einfach zurückrechnen.
Ich gehe davon aus, dass hier der DeviceContext(getDC) genutzt wird um eine DI_RGB/DIB_RGB_COLORS Bitmap (24 oder 32 Bit) zu erhalten. Dies ist zumindest der schnellste Weg ein Bild zu erhalten.

die Bitmap ist im Format BGRBGRBGR... gespeichert. BGR ! nicht RGB ! Die Bitmap, die man über Bitblt(SRCCOPY) erhält, gibt die Farbwerte Rückwärts aus.
Zudem wird bei positiver höhe das Bild "auf dem Kopf" generiert..
Wähle eine Negative Höhe um das Bild "richtig herum" im Speicher abzulegen.
Ausgehend davon erhalten wir ein pixel an der Position x,y durch die Formel:
(y* HaystackBreite + x )* Bittiefe / 8
HaystackBreite sei hier die Breite des großen Bildes.. also vermutlich die Desktopbreite.
Diese Gleichung kann man einfach Umstellen um das gewünschte Ergebnis zu erhalten
Daifoku is offline  
Old 10/12/2015, 16:41   #11
 
elite*gold: 8
Join Date: Sep 2014
Posts: 625
Received Thanks: 177
Würde ich persönlich nicht nehmen. Sieht deutlich komplizierter aus als die gängigen Verfahren. Trotzdem danke
qqdev is offline  
Old 10/12/2015, 21:26   #12
 
elite*gold: 0
Join Date: Mar 2010
Posts: 360
Received Thanks: 132
Naja, eigentlich ist das ein sehr einfacher Algorithmus... Da gibt es weitaus schwierigere.
Zudem sind die Zeiten, die der Algorithmus braucht, unschlagbar.
Was sind denn die gängigen Verfahren ? ...

Ich schreib grad ne DLL...
Werde die später hier veröffentlichen und n kleines tut schreiben.
Aktueller Progress:

header

Anwendungsbeispiel

weitere Funktionen folgen noch
Attached Files
File Type: rar dbot.rar (12.3 KB, 1 views)
Daifoku is offline  
Old 10/12/2015, 22:47   #13
 
elite*gold: 8
Join Date: Sep 2014
Posts: 625
Received Thanks: 177
Quote:
Originally Posted by .SkyneT. View Post
Natürlich kann man das auch selber schreiben, es ist auch nicht unbedingt "schwer" und bestimmt eine gute Übung, wenn man jedoch vorankommen will, kann ich es mir sparen das alles hier:

noch einmal zu implementieren
Geh auf den Link von .SkyneT. und dann schau bei "Which are the matching methods available in OpenCV?"

Cool
qqdev is offline  
Old 10/12/2015, 23:28   #14
 
elite*gold: 0
Join Date: Mar 2010
Posts: 360
Received Thanks: 132
Da wird jedem Pixel ein normierter Werte über alle Pixel x', y' zugewiesen.
D.h. es werden (Breite * Höhe)^2 Operationen verwendet. Riesen Ressourcenverschwendung für eine exact-match-suche.

openCV braucht also polynomielle Zeit.
Boyer Moore ist in linearer Zeit fertig.

Angenommen wir suchen keine 1:1 Kopie und es gibt Shader Variationen, dann kann man die Suche trotzdem noch in linearer Zeit implementieren, indem man jeden Pixel in einen Lab Farbwert konvertiert (das sind zwei Schritte. Umwandeln in XYZ(Multiplikation mit einer Konstante) und dann in Lab (Wieder eine Multiplikation))

Anschließend nutzen wir die Euklidsche Norm und vergleichen unser template (Ich übernehme hier einfach mal die Bezeichnug von openCV, damit wir nicht durcheinander kommen) mit dem originalbild und verfahren mit BoyerMoore weiter.

Damit können wir identische, aber nicht zwangsweise gleiche Bilder, in linearer Zeit finden.
Daifoku is offline  
Old 10/16/2015, 18:19   #15
 
elite*gold: 8
Join Date: Sep 2014
Posts: 625
Received Thanks: 177
Quote:
Originally Posted by Daifoku View Post
Da wird jedem Pixel ein normierter Werte über alle Pixel x', y' zugewiesen.
D.h. es werden (Breite * Höhe)^2 Operationen verwendet. Riesen Ressourcenverschwendung für eine exact-match-suche.

openCV braucht also polynomielle Zeit.
Boyer Moore ist in linearer Zeit fertig.

Angenommen wir suchen keine 1:1 Kopie und es gibt Shader Variationen, dann kann man die Suche trotzdem noch in linearer Zeit implementieren, indem man jeden Pixel in einen Lab Farbwert konvertiert (das sind zwei Schritte. Umwandeln in XYZ(Multiplikation mit einer Konstante) und dann in Lab (Wieder eine Multiplikation))

Anschließend nutzen wir die Euklidsche Norm und vergleichen unser template (Ich übernehme hier einfach mal die Bezeichnug von openCV, damit wir nicht durcheinander kommen) mit dem originalbild und verfahren mit BoyerMoore weiter.

Damit können wir identische, aber nicht zwangsweise gleiche Bilder, in linearer Zeit finden.
Wieso?
qqdev is offline  
Reply


Similar Threads Similar Threads
Ordner vergleichen
05/27/2015 - Off Topic - 6 Replies
Hallo, ich suche ein Tool oder Möglichkeit, möglichst schnell zwei riesige Ordner (mit sehr vielen Unterordnern) zu vergleichen, hierbei möchte ich sehen, was bei Ordner 2 fehlt, was es in Ordner 1 gibt. Grüße
Bilder auf Ähnlichkeit vergleichen
10/07/2014 - AutoIt - 6 Replies
Hallo epvpler, Ich suche grade nach einer Möglichkeit, Bilder mit einander zu vergleichen und das Bild, dass dem orginal am ähnlichsten sieht soll dann benutzt werden. Nur leider weiß ich nicht wie ich das anstellen soll. Einige ideeen?
Textbox mit .txt vergleichen
08/25/2013 - .NET Languages - 1 Replies
Hi Freunde und zwar habe ich folgendes Problem: Ich habe eine textdatei die eine reihe von Bergrüßungen enthält. Und zwar möchte ich prüfen ob z.B. Textbox1.Text eine oder mehrere Bergrüßungen aus der Textdatei enthält Bsp Begrüßungen: hi hallo yo Text:
[c#] 2 hexstrings vergleichen
08/29/2012 - .NET Languages - 4 Replies
hallo com, ich habe ein Problem welches mir keine logische Erklärung bietet... ich möchte 2 strings vergleichen in denen jeweils ein hex Wert steht. es ist beides mal der selbe.. if (hex1 == hex2) {
[SQL]2 Spalten vergleichen
05/28/2012 - General Coding - 2 Replies
Guten Morgen, ich habe in einer Tabelle 2 Spalten time verfall nun möchte ich mir alle Einträge suchen, bei denen die Spalte "time" >= die Spalte "verfall" ist.



All times are GMT +2. The time now is 16:43.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.