Registriert: Do Mär 05, 2009 20:17 Beiträge: 284 Wohnort: Kaiserslautern
Hallo,
ich hoffe es stört niemanden das ich dafür einen neuen Faden eröffne, aber in den meisten Foren gilt ja: "Neue Frage, neuer Thread". Ich kann ja jetzt einen Screenshot wunderbar schnell erstellen (Danke Sascha), jetzt habe ich aber folgendes Problem:
Je nach Geometrie des fotografierten Objekts und der gegebenen Bildschirmauflösung entsteht ein mehr oder weniger großer weißer Rand an allen vier Seiten des Bildes. Diesen Rand möchte ich nicht, aber auch nichts von der Geometrie wegschneiden..
Also habe ich mir etwas gebastelt das ungefähr so aussieht:
Code:
function TScreenShotManager.CropFromBottom(h:Integer; w:Integer):integer;//Height und Width des Bildes
Wie ihr seht, prüfe ich alle 15 Zeilen und alle 10 Spalten ob da Hintergrundfarbe ist, beim ersten Treffer geh ich raus aus der Procedur.. Analoge Functions habe ich für die übrigen 3 Seiten.
Das ganze funktioniert zwar ausreichend gut ist aber wiedermal zu langsam für meinen Geschmack. Konkret braucht der derzeitige Kram für 400 Bilder (1080x1620) ca. 35 Sekunden, hinzu kämen dann noch etwa 55 Sekunden bis die Bilder auf Festplatte stehen + X für sachen die ich noch nicht gecodet hab.
Ich habe noch zwei drei Ideen diese Variante zu optimieren, so prüfe ich zur Zeit die vier Eckbereiche jeweils doppelt, dies kann ich sicher vermeiden und vielleicht nochmal 10-20% rausholen.
Ein anderer Gedanke wäre die betreffenden Eckpunkte der Boundingbox auf Bildschirmkoordinaten auszuwerten und erst ab dort zu croppen, das könnte nochmal paar prozent bringen.
Was ich auch nicht hinbekommen habe ist mir mit glreadpixels den farbwert in eine einzige zahl statt 3 zahlen zu schreiben..
mit farbe als gluint hat nicht geklappt da gabs ne AV. Dann wäre die anschliessende if prüfung schlanker. Gibts da ne Möglichkeit?
Aber im Grunde gefällt mir das ja alles nicht, kann man nicht irgendwie ein bmp dynamisch groß machen und nur mit pixeln befüllen die nicht der glclearcolor entsprechen? dann wäre das was ich hier treibe nicht nötig.
Registriert: Sa Aug 18, 2007 18:47 Beiträge: 694 Wohnort: Köln
Programmiersprache: Java
Vielleicht hilft es wenn du die Objekte beim Zeichnen der Auflösung entsprechend skalierst? Mit einer Boundingbox + Matrizen (die beim Rendern Verwendung finden) könntest du min und max Koordinaten ermitteln, dann das gesamte Objekte skalieren und so passgenau in die Textur schieben oder eben einfach croppen.
_________________ Es werde Licht. glEnable(GL_LIGHTING); Und es ward Licht.
Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"
Registriert: Sa Aug 18, 2007 18:47 Beiträge: 694 Wohnort: Köln
Programmiersprache: Java
Deine Prozedur sucht im entstandenen Bild nach dem Objekt? Die Boundingbox gibt dir aber immer die exakten min/max Werte mit einem Bruchteil des Aufwandes.
_________________ Es werde Licht. glEnable(GL_LIGHTING); Und es ward Licht.
Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"
Registriert: Do Mär 05, 2009 20:17 Beiträge: 284 Wohnort: Kaiserslautern
das stimmt aber nur für objekte bei denen auch geometrie an den ecken der boundingbox ist... siehe bild mit Beispiel zur Verdeutlichung:
ich werde mal testen wieviel schneller es wird, wenn ich vor meinem jetzigen crop Mechanismus die Boundingbox berücksichtige.. wollte nur die Experten hier fragen ob es da nichts fertiges oder "einfacheres" gibt..
offen ist auch noch die Frage wie ich mit glreadpixels den rückgabewert in eine Zahl und nicht in 3 floats schieben kann... geht das?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich würde mal sehen, ob es nicht schneller ist, alle Vertices des Objektes in Screenspace zu transformieren und daraus die screenspace-boundinbox zu berechnen.
grüße
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.