Autor Beitrag
M0u53
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 23.01.07 16:27 
Hallo
Ich habe ein Problem mit Zahlen ;) Also ich würde gerne Zahlen vom AktiveDesktop einlesen.
Als Beispiel nenne ich jetzt mal die Windoof Uhr die ihr vermutlich alle in der rechten unteren ecke eures desktops seht! Nehmen wir mal an das diese Uhr keine Schnittstelle hätte mit der man den Stand Abfragen kann ;)
Ich möchte gerne die Zahlen direkt einlesen. Allerdings habe ich keinen erfolg bei der Suche nach Mustererkennung oder begriffen wie Grab Numbers from desktop gehabt
Deshalb hoffe ich hier Hilfe zu finden

Mfg und in hoffnung auf baldige "Rettung" M0u53
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Di 23.01.07 16:32 
Ich denk mal du meinst den Active Desktop von Windows 98. Ich kenn mich damit nicht so aus, ich weiß nicht ob man da einfach ne WM_GETTEXT Nachricht hinschicken kann. Wenn doch, dann mach das, wenn nicht, dann musst du wohl oder übel OCR nehmen, was durchaus kompliziert und langsam wird.
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Di 23.01.07 16:32 
Hi!

Du erwartest nicht wirklich eine Funktion FindeZahlenAufBitmap, oder? Das Thema Mustererkennung ist dermaßen groß und komplex, daß es schon sehr viel Programmier-Aufwand erfordert. Delphi liefert meines Wissens nach nichts dafür mit.

Wofür brauchst du es denn jetzt genau? Zahlen vom Active-Desktop einlesen? Welche Zahlen? Warum der Aufwand?

Cu,
Udontknow
M0u53 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 23.01.07 16:35 
Die systemuhr war nur ein beispiel ich meine sie in keinerlei hinsicht ^^ hab sie nur genannt, da man die zahlen nicht markieren und kopieren kann also
stell dir ein Bild vor wo an einem bestimmten Pixelwert Zahlen stehen.
es gibt keinen weg direkt die zahlen abzufragen.
Also müssen sie eingelesen werden...
Es wäre schön wenns so einfach wäre! Und bei allen sachen, die ich bezüglich Mustererkennung gefunden habe würden zuviele ressorcen verbraucht, da das programm im hintergrund laufen soll während andere programme im vordergrund laufen

Jetzt mal ein bisschen detailreicher ;)
Also es geht nicht um eine "Suche" oder ähnliches. Die Zahlen sind in einem Festen Pixelfeld und sollen ausgelesen werden. Leider bietet mir das programm aus dem sie ausgelesen werden (silkroad für alle dies kennen) keine schnittstelle auf die ich zugreifen könnte. Deshalb muss ich diese zahlen auf diese umständliche weise "einlesen"


Zuletzt bearbeitet von M0u53 am Di 23.01.07 16:39, insgesamt 1-mal bearbeitet
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Di 23.01.07 16:38 
user profile iconM0u53 hat folgendes geschrieben:
Die systemuhr war nur ein beispiel ich meine sie in keinerlei hinsicht ^^ hab sie nur genannt, da man die zahlen nicht markieren und kopieren kann also
stell dir ein Bild vor wo an einem bestimmten Pixelwert Zahlen stehen.
es gibt keinen weg direkt die zahlen abzufragen.
Also müssen sie eingelesen werden...
Es wäre schön wenns so einfach wäre! Und bei allen sachen, die ich bezüglich Mustererkennung gefunden habe würden zuviele ressorcen verbraucht, da das programm im hintergrund laufen soll während andere programme im vordergrund laufen

Es wäre auch schön, wenn du auf unsere Fragen eingehen würdest ;)

Wird auf dem Desktop eine Webseite angezeigt, von der du die zahlen auslesen möchstest? Dann geht das auch einfacher, nämlich über HTTP. Du musst schon etwas mehr Info liefern.
M0u53 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 23.01.07 16:46 
Sorry dein eintrag kam zu spät ;)
hab mal beispiel angehängt
Einloggen, um Attachments anzusehen!
M0u53 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 23.01.07 16:49 
user profile iconM0u53 hat folgendes geschrieben:
Sorry dein eintrag kam zu spät ;)
hab mal beispiel angehängt


Prob beschreibung wurde oben eingefügt
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Di 23.01.07 16:52 
Wenn die beiden Zahlen immer an exakt der gleichen Stelle stehen und du nur die beiden Zahlen auslesen möchtest, müsste das machbar sein.
M0u53 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 23.01.07 16:54 
Machbar ja... nur wie... habe keine idee mehr... hatte gehofft das jemand schomal ein problem in die richtung hatte und mir tipps geben könnte
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Di 23.01.07 17:00 
Hmm, würde das so machen: Jede einzelne Ziffer aus dem Bild nehmen und von diesem Ausschnitt einen kleinen Hash nehmen. Und dann kannst du jeden Hash mit einer internen Liste vergleichen und kriegst so die Ziffern. Das heißt du musst erstmal 10 Screenshots machen, sodass du von jeder Ziffer 0-9 einen kleinen Bildschirmausschnitt hast. Die tust du dann hashen und intern ins Programm schreiben. So würds ich machen.
Robinator
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 275

WinXP
BDS 2006
BeitragVerfasst: Di 23.01.07 17:03 
Ich will euch ja nicht enttäuschen, aber OCR ist schon nen ziehmlich komplexes Thema. Sobald jemand ne andere Schriftart, ne andere Hintergrundfarbe oder auch ne andere Auflösung benutzt, wird das ganze konzept gewaltig ins schwanken geraten.
Sinnvoller wäre es IMHO den Speicher des Programms, welches die Zahlen darstellt auszulesen.

gruss
wdbee
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: Di 23.01.07 17:06 
Mit der folgenden Funktion lässt sich so etwas sogar dann machen, wenn die genaue Lage nur ungefähr bekannt ist.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
//==========================================================================*
// Vergleich eines Musterbildes (Modell) mit einem größeren Bild(ausschnitt)
//
// Bild in dem gesucht wird:
// Bits      := Zeiger auf Beginn des Bildes (Grauwerte oder RGB-Werte wie Bitmap)
// DIBWidth  := Breite des Bildes in Pixeln
// DIBHeight := Höhe des Bildes in Pixeln
//
// Ausschnitt in dem gesucht wird:
// DX        := Suchebreite (Von OLeft-DX bis OLeft+DX suchen) in Pixeln
// DY        := Suchehöhe   (Von OTop-DY bis OTop+DY suchen) in Pixeln
// Step      := Schrittweite in Pixeln
//
// oBitBuffer: Modell (Grauwerte oder RGB-Werte analog einer Bitmap)
//
// Aus der Klasse bzw globale Variablen:
// Eingabe:
// oLeft: Startpunkt von links (Angenommene linke obere Ecke)
// oTop: Startpunkt von oben
// oPSize: bei RGB = 3 bei GrayScale = 1
// oWidth: Breite des Modells
// oHeight: Höhe des Modells

// Ausgabe:
// oBestMatchLeft: Position mit der besten Übereinstimmung links
// oBestMatchTop: Position mit der besten Übereinstimmung oben
//--------------------------------------------------------------------------*
function ScaledConvolution
  (Bits: PByte; DIBWidth, DIBHeight, DX, DY, Step: Integer;
   MaxR: Double): Double;
var
  I, J, N, Left, Top: Integer;
  L, T: Integer;
  Pixel: PByte;
  SumI, SumI2, SumIM: Double;
  R: Double;
  MinX, MinY, MaxX, MaxY: Integer;
  Muster: Byte;
begin
  N := oPSize * oWidth * oHeight;                // Anzahl der Pixel im Mod.

  R := 0;                                        // Pessimistische Prognose
  Result := R;
  MinX := oLeft - DX;                            // Linken Suchrand bestimm.
  MaxX := oLeft + DX;                            // Rechten Suchrand bestimm.
  MinY := oTop - DY;                             // Oberen Suchrand bestimm.
  MaxY := oTop + DY;                             // Unteren Suchrand bestimm.
  if MinX < 0 then                               // Grenzwerte überwachen
    MinX := 0;                                   // um Zugriffsfehler
  if MinY < 0 then                               // auf Pixel außerhalb
    MinY := 0;                                   // des Bildes
  if MaxX > DibWidth - oWidth then               // zu verhindern
    MaxX := DibWidth - oWidth;
  if MaxY > DibHeight - oHeight then
    MaxY := DibHeight - oHeight;

  T := MinY;                                     // Aktueller Hochwert
  while T <= MaxY do                             // Solange er über dem
  begin                                          // unteren Rand liegt
    L := MinX;                                   // Aktuellen Linkswert set.
    while L <= MaxX do                           // Solange er links vom
    begin                                        // rechten Rand liegt
      SumI := 0.0;                               // Summen neu initialisieren
      SumI2 := 0.0;
      SumIM := 0.0;

      Pixel := Bits;                             // Beginn des Bildes
      Inc(Pixel,                                 // Beginn des Modells
        oPSize*(L+                               //   Spaltenoffset
       (DIBHeight-T-oHeight)*DIBWidth));         //   Zeilenoffset

      for I := 0 to oHeight - 1 do               // Für alle Zeilen des
      begin                                      // Modells
        for J := 0 to oPSize*oWidth - 1 do       // Für alle Spalten des
        begin                                    // Modells
          Muster := oBitBuffer[oPSize*I*oWidth+J];
          if Muster > 0 then                     // Wenn kein Dont Care Pixel
          begin                                  // im Modell vorliegt
            SumI := SumI + Pixel^;               // Summe der Bildpixelwerte
            SumI2 := SumI2 + Pixel^ * Pixel^;    // Summe der Quadrate dazu
            SumIM := SumIM +
              Pixel^ * Muster;                   // Summe der Produkte
          end;
          Inc(Pixel);                            // Nächsten Pixel
        end;
        R := (SumIM - (SumI * oSumM) / N);       // Teilergebnis
        Inc(Pixel,oPSize*(DIBWidth-oWidth));     // Nächste Zeile
      end;

      try
        R := R*R /((SumI2 - SumI * SumI / N)     // Quadrat der Korrelation
          * oSumMFaktor);
      except
        R := 0.0;
      end;

      if R > Result then                         // Wenn Wert besser als
      begin                                      // bisher ist
        Result := R;                             // Ergebnis merken
        oBestMatchLeft := L;                     // Position merken
        oBestMatchTop := T;
      end;
      Inc(L,Step);                               // Schritt nach rechts
    end;
    Inc(T,Step);                                 // Schritt nach unten
    if Result > MaxR then
      break;
  end;
end;
//==========================================================================*
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Di 23.01.07 17:07 
user profile iconRobinator hat folgendes geschrieben:
Ich will euch ja nicht enttäuschen, aber OCR ist schon nen ziehmlich komplexes Thema. Sobald jemand ne andere Schriftart, ne andere Hintergrundfarbe oder auch ne andere Auflösung benutzt, wird das ganze konzept gewaltig ins schwanken geraten.
Sinnvoller wäre es IMHO den Speicher des Programms, welches die Zahlen darstellt auszulesen.

gruss

Du hast schon Recht. Ich hoffe mal, dass das Prog nur für ihn ist, d.h. Auflösung und so bleibt alles gleich.
Jetstream
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 222



BeitragVerfasst: Di 23.01.07 17:11 
Silkroad hat die Zahlen doch im Speicher, wie jedes andere Spiel.
Wenn du beim Programmstart nach den Adressen im Speicher suchst, solltest du fündig werden. Es gibt ne Menge Topics dazu bei Elitepvpers

_________________
Die folgenden Klangbeispiele sind Ergänzungen zum methodischen Aufbau der Textbeilage und dürfen nicht losgelöst von dieser behandelt werden.
M0u53 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 23.01.07 17:16 
Das Programm ist erstmal nur für mich gedacht bis ich alle funktionen einwandfrei am laufen haben sollte...
Mal zu dem Quellcode oben Wenn ichs richtig verstanden habe sucht er nur in dem Bild nach einem ihm bekannten Bild (auch wenn ich ihn an sich nahezu garnicht verstanden habe ;) ) Wie hilft mir der eine Mehrstellige zahl auszulesen, welche auch noch dauernd ihren wert ändert
Robinator
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 275

WinXP
BDS 2006
BeitragVerfasst: Di 23.01.07 17:16 
Mein Reden ;)
Robinator
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 275

WinXP
BDS 2006
BeitragVerfasst: Di 23.01.07 17:18 
user profile iconM0u53 hat folgendes geschrieben:
Das Programm ist erstmal nur für mich gedacht bis ich alle funktionen einwandfrei am laufen haben sollte...
Mal zu dem Quellcode oben Wenn ichs richtig verstanden habe sucht er nur in dem Bild nach einem ihm bekannten Bild (auch wenn ich ihn an sich nahezu garnicht verstanden habe ;) ) Wie hilft mir der eine Mehrstellige zahl auszulesen, welche auch noch dauernd ihren wert ändert


Der code vergleicht zwei Bilder unterschiedlicher Grösse. Du könntest also (auch wenn ich dir davon, wie schon vorher gesagt, stark abrate) Referenzbilder für alle Zahlen [0..9] erstellen, und diese mit den dargestellten vergleichen.

Guck dir lieber mal an wie du das ausm Speicher ausliest!

Gruss, Rob
wdbee
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: Di 23.01.07 17:20 
Ist doch klar: Ein Muster für jedes vorkommende Zeichen (macht 10 Stück bei Zahlen)
Die Position ist die ja bekannt, also vergleichst du jede möglich Position mit jedem Muster. Das Muster, dass die höchste Übereinstimmung liefert nimmst du für die jeweilige Stelle.

Alle Stellen zusammen liefern die Info über die Zahl.
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Di 23.01.07 18:13 
user profile iconM0u53, welche Anwendung ist das jetzt genau, wo der Text angezeigt wird? Vielleicht lassen sich die beiden Zahlen wirklich einfach so aus dem Speicher auslesen, wenn du Glück hast. Mit Suche in der Entwickler-Ecke TSEARCH die Adressen der beiden Zahlen suchen, und dann im Programm auslesen.
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 23.01.07 22:40 
OCR with Microsoft® Office

www.codeproject.com/csharp/modi.asp

Unter <Search> kannst Du mal "ocr" eingeben...