Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > .NET Languages
You last visited: Today at 21:42

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

Advertisement



Pixel suchen mit VB.NET

Discussion on Pixel suchen mit VB.NET within the .NET Languages forum part of the Coders Den category.

Reply
 
Old   #1


 
Requi's Avatar
 
elite*gold: 3800
The Black Market: 244/0/0
Join Date: Dec 2012
Posts: 13,039
Received Thanks: 8,243
Pixel suchen mit VB.NET

Ich versuche mich gerade an einer Pixelsuch Funktion, die vom Screen einen angegeben Pixel sucht und die X und Y Koordinaten zurück gibt.

Da ich was schnelles brauche, sind mir 1540 ms zu langsam. Und das in einem 2.Thread.
Ohne 2. Thread sind es bis zu 2100 ms.

Hätte da jemand was relativ schnelles, denn der Bot muss schnell hinterher kommen, bevor er sich verklickt.

Was ich habe:

MfG
Requi is offline  
Old 08/09/2013, 23:31   #2
 
tolio's Avatar
 
elite*gold: 2932
The Black Market: 169/1/0
Join Date: Oct 2009
Posts: 6,966
Received Thanks: 1,097
tolio is offline  
Thanks
1 User
Old 08/09/2013, 23:36   #3

 
snow's Avatar
 
elite*gold: 724
Join Date: Mar 2011
Posts: 10,480
Received Thanks: 3,319
Du hast hier halt ne Laufzeit von O(height * width), was recht langsam ist.
Was du evtl. versuchen könntest, wäre das aufsplitten des Bildes und dann z.B. erst die linke Hälfte abzusuchen. Wenn da nichts dabei ist, suchst du die obere Hälfte der rechten Hälfte ab, wenn da nichts dabei ist, die linke Hälfte der unteren Hälfte der rechten Seite, wenn da nichts dabei ist die linke Hälfte der rechten Hälfte der unteren Hälfte der rechten Seite usw.

Irgendwas in die Richtung müsstest du machen, dass deine Laufzeit eher in Richtung logarithmisch geht.
snow is offline  
Thanks
1 User
Old 08/10/2013, 02:23   #4


 
Requi's Avatar
 
elite*gold: 3800
The Black Market: 244/0/0
Join Date: Dec 2012
Posts: 13,039
Received Thanks: 8,243
Das ist gerade das Problem.
Ich weiß, dass es so dreckslahm ist, weil es höhe * weite durchläufe macht.
Bei mir wären das:
1600x900=
1.440.000 Durchläufe.

Ich schau mir mal das von tolio an und schau was ich damit anfangen kann.

EDIT: Habs mir jetzt mal angeschaut, aber verstehe es nicht wirklich.
Was zum Beispiel ist der PaintEventArgs. Ich meine es ist das Bild, das übergeben werden soll. Aber das mache ich ja schon während der Beispiel Sub.

Und was genau macht denn die Sub am Ende.
Was genau muss ich machen (Pseudo-Code reicht mir), damit er mir einen Pixel aus der Bitmap sucht. Soweit ich es verstanden habe, speichert LockBits die Bitmap im Speicher und ist festgesetzt dort, bis man sie wieder unlocked, oder einen Restart macht.

Das war es erstmal mit meinen Fragen
Requi is offline  
Old 08/10/2013, 14:54   #5
 
elite*gold: 0
Join Date: May 2010
Posts: 793
Received Thanks: 268
Quote:
Originally Posted by snow911 View Post
Du hast hier halt ne Laufzeit von O(height * width), was recht langsam ist.
Was du evtl. versuchen könntest, wäre das aufsplitten des Bildes und dann z.B. erst die linke Hälfte abzusuchen. Wenn da nichts dabei ist, suchst du die obere Hälfte der rechten Hälfte ab, wenn da nichts dabei ist, die linke Hälfte der unteren Hälfte der rechten Seite, wenn da nichts dabei ist die linke Hälfte der rechten Hälfte der unteren Hälfte der rechten Seite usw.

Irgendwas in die Richtung müsstest du machen, dass deine Laufzeit eher in Richtung logarithmisch geht.
auch mit der methode wird die laufzeit nicht logaritmisch werden.

@te:
naja zum einen rufst du Color.FromArgb(A, R, G, B) innerhelb der schleife auf, besser währe es ausserhalb damit es nur einmal aufgerufen wird.

zum zweiten ist bmp.GetPixel auch nicht wirklich schnell, in C# würde man unsafe benutzen, in VB geht das nicht. ist es wohl das beste das ganze mit Marshall.Copy in ein array zu kopieren. In dem zusammenhalb benutzt du auch die methode von tolio.

naja die erste und letzte iele bruchst du nicht. du bauchst nur
Code:
    ' Create a new bitmap. 
    Dim bmp As New Bitmap("c:\fakePhoto.jpg")

    ' Lock the bitmap's bits.   
    Dim rect As New Rectangle(0, 0, bmp.Width, bmp.Height)
    Dim bmpData As System.Drawing.Imaging.BitmapData = bmp.LockBits(rect, _
        Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat)

    ' Get the address of the first line. 
    Dim ptr As IntPtr = bmpData.Scan0

    ' Declare an array to hold the bytes of the bitmap. 
    ' This code is specific to a bitmap with 24 bits per pixels. 
    Dim bytes As Integer = Math.Abs(bmpData.Stride) * bmp.Height
    Dim rgbValues(bytes - 1) As Byte 

    ' Copy the RGB values into the array.
    System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes)

    ' Set every third value to 255. A 24bpp image will look red. 
    For counter As Integer = 2 To rgbValues.Length - 1 Step 3
        rgbValues(counter) = 255
    Next 

    ' Unlock the bits.
    bmp.UnlockBits(bmpData)
rgbValues ist der inhalt des bildes als byte array, dh es hat die grösse 3*höhe*breite (3 da jedes pixel aus 3 bytes (rgb) besteht).

und anstatt jetzt jedes dritte pixel auf 255 zu setzten, überprufst du eben in der schleife ob es die gewünschte farbe ist.
nkkk is offline  
Old 08/10/2013, 15:37   #6
 
elite*gold: 100
Join Date: Aug 2005
Posts: 595
Received Thanks: 208
Das ist eine relativ klassische Frage

Wenn du dich mit dem ganzen nähe auseinandersetzen willst sieh dir mal Sortier und Such Algorhytmen an.

Grundlegendes um etwas mehr Perfomance rauszubekommen wurde ja schon genannt.

Deine Problemstellung hier ist das du eine "große" Datenmenge hast und nach etwas bestimmten suchst.

Ansätze für soetwas sind z.b. :

1. Zerleg die Datenmenge in kleinere Mengen, intressante Ergebnisse erreicht man z.b. wenn man die Gesammtmenge in 10 kleinere Ausschnitte zerlegt und diese mit einer zufälligen Reihenfolge abarbeitet. Die Maximal Zeit bleibt die selbe aber die Wahrscheinlichkeit das der Algo früher ein Treffer hat erhöht sich.

2. Benutze Muster bei der Erkennung, es ist recht unwahrscheinlich das es nur einen Pixel mit der gesuchten Farbe gibt, durchsuche also zuerst nur jeden 2. Pixel, erst wenn das nicht zum erfolg führt die restlichen.
(Hier kann man sich austoben, ist auch ein relativ intressantes Projekt, Bsp. Bau ein Programm das Zufällige Muster für die Suche wählt, lass sie jeweils x-Stunden auf dein Ziel los, und gib danach dem Muster einen Score wie gut er abgeschnitten hat, war durchaus beeindruckt was für gute Muster man finden kann, einziger Nachteil man bekommt nicht mit warum genau ein Muster sehr gut ist.)


3. Nutze die heutige Hardware, ist dein Problem erstmal in kleine Teilprobleme zerlegt, gibt es keinen Grund es nicht auszunutzen, heutzutage hat praktisch jeder Dual oder Quadcore Cpus, gut umgesetzt kann es imens Zeit einsparen.
dready is offline  
Old 08/10/2013, 17:33   #7
 
'Heaven.'s Avatar
 
elite*gold: 1
The Black Market: 331/0/0
Join Date: Jun 2012
Posts: 5,819
Received Thanks: 3,200
LINQ ist dazu noch schneller als For und For Each schleifen + If Abfragen
'Heaven. is offline  
Old 08/11/2013, 02:51   #8
 
elite*gold: 100
Join Date: Aug 2005
Posts: 595
Received Thanks: 208
schleifen sollten schneller sein als LINQ oder hab ich da was falsch im kopf ?
dready is offline  
Old 08/11/2013, 03:27   #9


 
Requi's Avatar
 
elite*gold: 3800
The Black Market: 244/0/0
Join Date: Dec 2012
Posts: 13,039
Received Thanks: 8,243
Könnte mir kurz jemand erklären was genau LINQ ist?
Requi is offline  
Old 08/12/2013, 14:13   #10
 
'Heaven.'s Avatar
 
elite*gold: 1
The Black Market: 331/0/0
Join Date: Jun 2012
Posts: 5,819
Received Thanks: 3,200
Quote:
Originally Posted by dready View Post
schleifen sollten schneller sein als LINQ oder hab ich da was falsch im kopf ?
Nachdem LINQ geladen ist ist es wesentlich schneller soweit ich weiß
'Heaven. is offline  
Reply


Similar Threads Similar Threads
code : Mauszeiger von pixel x zu pixel x bewegen
06/04/2012 - AutoIt - 9 Replies
Hey ich hab mich noch nicht wirklich mit Auto it beschäftigt Ich suche eben einen code der den Mauszeiger von Position x zu position x bewegt . Und AutiIt hat doch eine Funktion um die position zu ermitteln also der Punkt ist meinetwegen 1773 pixel. mfg and thx 4 help;) nicki240
AutoIt Pixel suchen
06/22/2011 - AutoIt - 2 Replies
Hallo, ich wollte nur kurz nochmal wissen wie ich den Farbwert etc von ner Pixel herausfinde. Mfg
Pixel schneller suchen?
04/12/2011 - AutoIt - 8 Replies
Hey Leute ich hab ein Problem mit einem pixelsearch Script. Folgendes: While 1 $variable = PixelSearch( 720,155,1517,718,0xEB1609) If IsArray($variable) = True Then MouseMove($variable, $variable) MouseClick("left") EndIf WEnd
[C++] Pixel Suchen aber wie? mit GetPixel()?
07/07/2009 - C/C++ - 16 Replies
Hi leute, suche was zum Pixel suchen! hatte gegoogle und kam bis jetzt nur auf die Funktion GetPixel() aber ich habe nichts gutes darüber gehört könnte mir jemand ne bessere besser Funktion zur Pixel suche zeigen mit beispiel bez Erklärung da ich mit den Sourcecodes teilweise nicht mitkomme den ich zu GetPixel() gefunden! Grund Kenntnisse in C++ habe ich mehr als genug plos noch nicht sowas und ich will mich langsam an sowas ran arbeiten hatte das hier gefunden plos weiß ich...



All times are GMT +2. The time now is 21:42.


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.