Auf den Speicher eines Bitmaps zugreifen (CDC)



  • Hallo

    ich weiß, der Threadtitel ist nicht grad optimal, ich bitte um Nachsicht.

    Zu meinem Problem:

    Ich möchte zwei Bilder (bmp) derart miteinander vergleichen, dass ich feststellen kann, an welcher Position die beiden Bilder am besten zueinander passen um aus zwei eins zu machen. Die geschieht nun so, dass ich zwei Bilder jeweils in einem CDC* Objekt habe und die Daten per GetPixel(); in einen zweidimensionalen Array einlese. Die so gewonnenen Daten kann ich super miteinander Vergleichen und die korrekte Position feststellen.

    Das Feststellen der Position wird über einen Algorithmus gelöst, der die entsprechenden Bilddaten übereinander „schiebt“ und die "überlappenden" Pixel miteinander vergleicht.

    Bis hierhin funktioniert das ganze tadellos, allerdings ist das Ganze quälend langsam...

    Logisch ist das langsam, wenn ich zwei Bilder miteinander vergleiche, die sagen wir mal 1000 Pixel breit sind und sich um 50x50 Pixel überlappen, komme ich auf 50 mögliche Positionen in X Richtung (for Schleife), wobei 1000 Pixel (in einer for Schleife) verglichen werden müssen und das Ganze nun auch noch für 50 Pixel in Y Richtung (weitere for Schleife). Macht insgesamt 50 mal 1000 mal 50, ergibt 2,5 Millionen Schritte für die for Schleifen plus die eigentliche Berechnung und die jeweiligen Speicherzugriffe... Kurz es ist nicht tragbar.

    Das Ganze muss also schneller gehen, meine Idee ist es nun die innerste for Schleife (also die, in der die 1000 sich überlappenden Pixel verglichen werden) einfach durch einen einzigen Speicherzugriff zu ersetzen. Wenn das direkt mit dem CDC* Objekt möglich ist, dann spare ich mir sogar das extra einlesen in einen Array. Theoretisch liegen die Bilddaten doch irgendwo im Speicher, da die interessanten Bilddaten auch noch in einer Reihe hintereinander liegen, müsste es doch möglich sein die beiden in Frage kommenden Speichersegmente in einem einzelnen Rechenschritt miteinander zu vergleichen. Position und Länge der Segmente innerhalb der Bilddaten kenne ich.

    Und jetzt kommt des Pudels Kern: wie mache ich das?

    Ich hab, da ich eigentlich nicht wirklich viel Ahnung habe (Theorie ja, aber Praxis nein), null Plan, wo oder wie ich da ansetze. Wie finde ich den Anfang der in dem CDC* Objekt gespeicherten Daten des Bitmaps? Wie lese ich diese Daten direkt aus dem Speicher? Kann man das überhaupt? Habt ihr Tipps, wo ich Informationen über eine solche Vorgehensweise bekomme? Bin ich im richtigen Forum?

    Es wäre super nett, wenn mir jemand einen Einstieg nennen könnte, an dem ich ansetzen kann. Wenn das Problem nicht ganz klar wird, oder weitere Informationen benötigt werden, bin ich gern bereit diese zur Verfügung zu stellen, einfach fragen.

    Ich bedanke mich im Vorraus.

    Gruß Stephan


Anmelden zum Antworten