ubuntuusers.de

Suche Hilfe bei einem kleinen Projekt in C

Status: Gelöst | Ubuntu-Version: Ubuntu 12.04 (Precise Pangolin)
Antworten |

Jonius Team-Icon

Ikhayateam
Avatar von Jonius

Anmeldungsdatum:
21. August 2009

Beiträge: 1862

Wohnort: München

Ich möchte ein bestehendes C-Programm umschreiben. Ich habe allerdings bisher fast ausschließlich in Java programmiert und habe zu C ein Buch durchgearbeitet, aber kaum Erfahrung. Deshalb suche ich jemanden, der mich ein bisschen unterstützt.

Der Hintergrund: Das Ganze soll dann mal als Serveranwendung laufen und einem gemeinnützigen Projekt als Spendenaktion dienen.

Das Programm: Es geht um Metapixel, dass aus vielen Einzelbildern ein Fotomosaik erstellt. Ich benötige aber ein Programm, das nur nach und nach (bei jedem Aufruf) einzeln die Bilder bekommt und so das Mosaik immer weiter zusammenbaut, aber jedes Mal das Zwischenergebnis liefert. In dem noch nicht gefüllten Bereich würde ich dann einfach das Zielbild zeichnen (evtl. in Graustufen).

Ich würde mich sehr freuen, wenn jemand mit C-Erfahrung Lust hätte, mich dabei zu unterstützen.

Moderiert von tomtomtom:

Ins passende Forum verschoben.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13365

Jonius schrieb:

Ich würde mich sehr freuen, wenn jemand mit C-Erfahrung Lust hätte, mich dabei zu unterstützen.

Ich kann Dir hier keine feste Unterstützung zusagen - dafür fehlt mir vermutlich die Zeit. Aber wenn Du konkrete Fragen hast, dann poste sie doch einfach hier im Forum. Die Wahrscheinlichkeit, dass Dir geholfen wird, ist m.E. recht groß.

Viele Grüße

robert

Jonius Team-Icon

Ikhayateam
(Themenstarter)
Avatar von Jonius

Anmeldungsdatum:
21. August 2009

Beiträge: 1862

Wohnort: München

Danke für Hilfsbereitschaft. Dann werde ich versuchen, konkrete Fragen zu stellen. Vorab noch Informationen zum besseren Nachvollziehen:

  • Ich bearbeite das Projekt in Eclipse mit dem CDT-Plugin. Wie man den aktuellen Quelltext mit unter Ubuntu funktionierendem Makefile bekommt, habe ich hier beschrieben.

  • Ich habe Kontakt mit Mark Probst (schani), einem der Entwickler von metapixel, der mir Fragen zur Funktionsweise von metapixel beantwortet.

  • Das hat mir Mark als Tipp gegeben:

In classic.c ist der High-Level Code um Mosaics zusammenzubauen. Dort wird - je nach local oder global - fuer jedes Tile das am besten bzw die am besten passendsten Bilder gesucht. Du braeuchtest einen umgekehrten Lookup - fuer ein neues kleines Bild willst Du das am besten passendste Tile finden, bzw das beste noch freie Tile. Das koenntest Du tun indem Du einfach eine Library anlegst deren Bilder die Tiles aus dem Originalbild sind. Die kannst Du dann speichern und ersparst Dir damit auch das erneute Analysieren des Originalbildes.

Mein aktueller Stand ist der, dass ich versuche, nachzuvollziehen, wie das Programm und vor allem die classic.c arbeitet, was mir etwas schwer fällt, weil ich bisher nur meine eigenen kleinen Programme gewohnt bin. Wenn ich konkrete Fragen dazu habe, werde ich sie hier stellen.

Mogli91

Anmeldungsdatum:
26. Dezember 2007

Beiträge: 155

Ich kann dir helfen, in den nächsten zwei Wochen habe ich Zeit. Außerdem programmiere ich sehr gerne in C.

Da fällt mir aber schon das erste Problem ein, das man nicht mir Programmcode lösen kann, sondern vorher logisch lösen muss: angenommen, wir laden ein Bild und geben an, in wie viele Tiles wir es unterteilen wollen. Wir laden das erste Bild. Logisch gesehen müsste jetzt dieses erste Bild in jedes Tile reingeladen werden, da wir nicht wissen, ob ein weiteres Bild geladen wird, das besser in eine Lücke hineinpasst.

Jonius Team-Icon

Ikhayateam
(Themenstarter)
Avatar von Jonius

Anmeldungsdatum:
21. August 2009

Beiträge: 1862

Wohnort: München

Mogli91 schrieb:

Ich kann dir helfen, in den nächsten zwei Wochen habe ich Zeit. Außerdem programmiere ich sehr gerne in C.

Vielen Dank! Leider bin ich ab Freitag erstmal 10 Tage im Urlaub und kann erst danach richtig loslegen.

Da fällt mir aber schon das erste Problem ein, das man nicht mir Programmcode lösen kann, sondern vorher logisch lösen muss: angenommen, wir laden ein Bild und geben an, in wie viele Tiles wir es unterteilen wollen. Wir laden das erste Bild. Logisch gesehen müsste jetzt dieses erste Bild in jedes Tile reingeladen werden, da wir nicht wissen, ob ein weiteres Bild geladen wird, das besser in eine Lücke hineinpasst.

Also ich habe mir das folgendermaßen vorgestellt:

  • Jedes Bild soll genau einmal verwendet werden (ob das realistisch ist, weiß ich nicht genau.

  • Wenn das erste Bild kommt, wird in den Teilen des Zielbildes nach dem am besten passenden Teil gesucht und dort wird es hingesetzt. Für alle weiteren dann das Gleiche Prinzip

  • Es kann so natürlich relativ leicht dazu kommen, dass ein Bild auf kein noch freies Teil wirklich passt. Für diesen Fall müsste man entweder die bereits vorhanden nochmal umsortieren oder es trotzdem irgendwo unpassend hin setzen. Metapixel hat auch bereits die Funktion zu cheaten, d.h. das Originalbild zu xx% halbtransparent auf das Mosaik zu legen, damit das Ergebnis besser aussieht.

  • Eine Anforderung ist auch, dass das Programm sich nicht zu viel Zeit lässt. Denn praktisch soll es so aussehen, dass ein Nutzer über eine Webseite ein Bild hochlädt, unsere Serveranwendung das Bild ins Mosaik einbaut und dem Nutzer das Mosaik präsentiert (letzteres wird über die Webseite geregelt). Deshalb darf die Berechnung nicht 5 Minuten dauern.

Beantwortet das deine Frage?

Mogli91

Anmeldungsdatum:
26. Dezember 2007

Beiträge: 155

IMHO:

Wenn es im Webbrowser laufen soll, warum wird es dann nicht auf der Clientseite ausgeführt? Ich kann zwar nur für mich sprechen, aber: mein Internet ist sehr langsam (384kbit/s), aber ich habe einen relativ guten PC. Ich glaube, die Berechnung in meinem Webbrowser würde schneller ablaufen, als andauernd meine Teilbilder hochzuladen und das errechnete Zwischenergebnis wieder herunterzuladen. Ich denke niemand wird vor der Benutzung die Auflösung der Teilbilder eigenhändig auf die maximal benötigte Größe herunterskalieren.

Wenn ich mir die ganzen Webanwendungen von Google anschaue denke ich, die heutigen PC's sind dieser Herausforderung gewachsen...

Ich denke auch nicht, das der Code allzu schwer auf JavaScript zu portieren ist. Oder man entwirft es als Java Applet. Damit kennst du dich ein bisschen besser aus denke ich.

brikkler

Anmeldungsdatum:
22. Juli 2008

Beiträge: 238

Jonius schrieb:

Mogli91 schrieb:

Da fällt mir aber schon das erste Problem ein, das man nicht mir Programmcode lösen kann, sondern vorher logisch lösen muss: angenommen, wir laden ein Bild und geben an, in wie viele Tiles wir es unterteilen wollen. Wir laden das erste Bild. Logisch gesehen müsste jetzt dieses erste Bild in jedes Tile reingeladen werden, da wir nicht wissen, ob ein weiteres Bild geladen wird, das besser in eine Lücke hineinpasst.

Also ich habe mir das folgendermaßen vorgestellt:

  • #1 Jedes Bild soll genau einmal verwendet werden (ob das realistisch ist, weiß ich nicht genau.

  • #2 Wenn das erste Bild kommt, wird in den Teilen des Zielbildes nach dem am besten passenden Teil gesucht und dort wird es hingesetzt. Für alle weiteren dann das Gleiche Prinzip

  • #3 Es kann so natürlich relativ leicht dazu kommen, dass ein Bild auf kein noch freies Teil wirklich passt. Für diesen Fall müsste man entweder die bereits vorhanden nochmal umsortieren oder es trotzdem irgendwo unpassend hin setzen. Metapixel hat auch bereits die Funktion zu cheaten, d.h. das Originalbild zu xx% halbtransparent auf das Mosaik zu legen, damit das Ergebnis besser aussieht.

  • #4 Eine Anforderung ist auch, dass das Programm sich nicht zu viel Zeit lässt. Denn praktisch soll es so aussehen, dass ein Nutzer über eine Webseite ein Bild hochlädt, unsere Serveranwendung das Bild ins Mosaik einbaut und dem Nutzer das Mosaik präsentiert (letzteres wird über die Webseite geregelt). Deshalb darf die Berechnung nicht 5 Minuten dauern.

meine paar gedanken dazu:

#1 man könnte das mit einem "strukt" lösen, in dem man sich quasi so was wie eine HashMap baut

#2 wie willst du nach dem "besten" passenden teil suchen? ich würde das mit zufallszahlen versuchen, vür den anfang ist jeder platz gleich gut. das problem mit dem abgleich bleibt aber

#3 siehe #2^^

Jonius Team-Icon

Ikhayateam
(Themenstarter)
Avatar von Jonius

Anmeldungsdatum:
21. August 2009

Beiträge: 1862

Wohnort: München

Mogli91 schrieb:

Wenn es im Webbrowser laufen soll, warum wird es dann nicht auf der Clientseite ausgeführt? Ich kann zwar nur für mich sprechen, aber: mein Internet ist sehr langsam (384kbit/s), aber ich habe einen relativ guten PC. Ich glaube, die Berechnung in meinem Webbrowser würde schneller ablaufen, als andauernd meine Teilbilder hochzuladen und das errechnete Zwischenergebnis wieder herunterzuladen. Ich denke niemand wird vor der Benutzung die Auflösung der Teilbilder eigenhändig auf die maximal benötigte Größe herunterskalieren.

Es geht darum, dass ein Mosaik aus den Einzelbildern verschiedener Nutzer zusammengebaut wird. Jeder Nutzer steuert nur eines bei. Wenn man das auf der Seite des Clients machen würde, hieße das, dass der der Server dem Client alle bisher eingegangenen Bilder zusenden müsste, anstatt dass der Client das eine Bild sendet. brikkler schrieb:

#1 man könnte das mit einem "strukt" lösen, in dem man sich quasi so was wie eine HashMap baut

Soweit ich das richtig sehe, wird das bei metapixel auch schon so gemacht.

#2 wie willst du nach dem "besten" passenden teil suchen? ich würde das mit zufallszahlen versuchen, vür den anfang ist jeder platz gleich gut. das problem mit dem abgleich bleibt aber

So wie im Normalfall für jedes Teil das beste Bild gesucht wird, wird nun umgekehrt für das aktuelle Bild das beste noch freie Teil gesucht. Nach welchen Kriterien das bei metapixel genau ausgesucht wird, habe ich mir noch nicht angeguckt. Aber das ist ja für mich auch nicht so interessant, weil ich das einfach beibehalte.

Jonius Team-Icon

Ikhayateam
(Themenstarter)
Avatar von Jonius

Anmeldungsdatum:
21. August 2009

Beiträge: 1862

Wohnort: München

Hier bin ich wieder. Könnte sich vielleicht jemand mal den Quelltext ansehen? Ich verstehe nur sehr grob, was an entscheidender Stelle passiert und wo ich ansetzen soll. Ich habe mir den Programmablauf mit dem Debugger etwas angesehen und festgestellt, dass das Entscheidende in den Funktionen 'generate_local' in 'classic.c', sowie 'search_metapixel_nearest_to' in 'search.c' passiert. Ich weiß, meine Bitte in unkonkret, aber ich habe das Gefühl vor einem Berg zu stehen und weiß nicht, wie ich drüber kommen soll.

Jonius Team-Icon

Ikhayateam
(Themenstarter)
Avatar von Jonius

Anmeldungsdatum:
21. August 2009

Beiträge: 1862

Wohnort: München

Ich habe jemanden gefunden, der das übernimmt. Danke für alle, die sich damit beschäftigt haben!

Antworten |