Chance auf einen C++-Job als PHP-Umsteiger?



  • Hallo,

    ich verfolge dieses Forum schon eine Weile und lerne C++ und seit neustem auch Qt, allerdings mit Pausen dazwischen. Beruflich arbeite ich seit über 10 Jahren als PHP-Anwendungsentwickler und würde aber gerne in C++-Schiene wechseln.

    Wie sehen da meine Chancen aus? Ich müsste bei einigen Sachen fast bei Null anfangen, würde aber auch mit einem Gehalt von 1.500 EUR brutto als Umsteiger zufrieden nach Hause gehen. Ich wohne in Berlin, bin über 40 Jahre und würde mich über Feedback freuen. Zur Zeit stehe ich in Arbeit und würde aber wie gesagt gerne den Bereich wechseln(ich habe nicht studiert).

    Max



  • SwitchIO schrieb:

    ich verfolge dieses Forum schon eine Weile und lerne C++ und seit neustem auch Qt, allerdings mit Pausen dazwischen. Beruflich arbeite ich seit über 10 Jahren als PHP-Anwendungsentwickler und würde aber gerne in C++-Schiene wechseln.

    Wie sehen da meine Chancen aus?

    PHP und C++ sind da schon sehr unterschiedliche Schienen.

    Bedauerlicherweise benötigt man schon eine gewisse Erfahrung, um die Vorteile von C++ zu verstehen und zielgerichtet einsetzen zu können.

    SwitchIO schrieb:

    Ich müsste bei einigen Sachen fast bei Null anfangen, würde aber auch mit einem Gehalt von 1.500 EUR brutto als Umsteiger zufrieden nach Hause gehen.

    Das wären nicht ganz 1100 Euro netto (single).

    Darf ich mal fragen, was in Berlin als PHP-Entwickler mit 10 Jahren Erfahrung so verdient?

    SwitchIO schrieb:

    Ich wohne in Berlin, bin über 40 Jahre und würde mich über Feedback freuen. Zur Zeit stehe ich in Arbeit und würde aber wie gesagt gerne den Bereich wechseln(ich habe nicht studiert).

    Okay. Sagen wir mal so: In den C++ Bereich wechselt man nicht mal eben so. Realistisch gesehen ist das Alter und die mangelnde Erfahrung ein Problem. Deine Bereitschaft für 1500 zu arbeiten kann ein Vorteil - aber auch ein Nachteil sein, denn das ist nicht gerade eine selbstbewusste Forderung.
    Wenn Du wechseln möchtest musst Du zunächst wenigstens fundierte Grundkenntnisse haben: Du darfst keine Probleme mit Zeigern haben (was nicht schwer ist, aber eine beliebte Fehlerquelle am Anfang). Je besser Du wirst, desto weniger Zeiger brauchst Du, aber verstehen muss man Zeiger halt.
    Objektorientierte Programmierung solltest Du von PHP kennen.

    Entsprechend Deines Alters solltest Du C++ nicht als Wechsel, sondern als Weiterentwicklung verkaufen. Dich selbst als jemand anbieten, der im Webbereich nicht nur PHP, sondern auch C++ anbieten kann. Zum Beispiel ein vorhandenes PHP-Projekt mit C++-Quellen erweitern.
    Da wird der Bedarf vermutlich eher gering sein. Auf der anderen Seite ist in Berlin wohl reichlich Bedarf an Entwicklern.
    PHP ist ja sehr viel String-Verarbeitung. Bei größeren Anbietern, die entsprechende Anfragenzahlen haben, könnte ich mir durchaus Interesse vorstellen, vorhandene PHP-Lösungen durch effizientere Lösungen zu ersetzen, um mehr Kunden bedienen zu können und eine performanteres Web-Erlebnis zu generieren.



  • Xin schrieb:

    Darf ich mal fragen, was in Berlin als PHP-Entwickler mit 10 Jahren Erfahrung so verdient?

    2500,- Eur brutto, da ich nicht studiert habe, sondern nur eine Ausbildung als Elektroniker habe. Bis 900,- EUR netto kann ich runter gehen, denn mehr brauche ich nicht zum Leben. Ich habe meine Ausgaben immer so angelegt, dass ich ersten nie Schulden mache und zweitens auch mit Arbeitlosengeld etc. zurecht komme, so habe ich wenig bis gar keine Angriffsfläche für berufliche Veränderungen oder gar Arbeitslosigkeit. Man lebt so einfach viel entpannter und hat eigentlich nie Geldsorgen. Außer man kann sich was nicht leisten, aber aus dem Alter bin ich zum Glück raus, als das ich auf irgendwas neidisch bin was ich mir nicht kaufen kann. Alles was mich glücklich macht kostet kein Geld, aber meine Maxime sollen hier kein Thema werden.

    Es wäre natürlich schön, wenn ich mit entsprechender Erfahrung dann neu verhandeln könnte.

    Xin schrieb:

    Du darfst keine Probleme mit Zeigern haben ...
    Objektorientierte Programmierung solltest Du von PHP kennen.

    Zeiger sind mit vertraut, da ich früher viel in Assembler und auch C programmiert habe, allerdings nur auf Hobbylevel.

    Xin schrieb:

    Entsprechend Deines Alters solltest Du C++ nicht als Wechsel, sondern als Weiterentwicklung verkaufen. Dich selbst als jemand anbieten, der im Webbereich nicht nur PHP, sondern auch C++ anbieten kann. Zum Beispiel ein vorhandenes PHP-Projekt mit C++-Quellen erweitern.

    Danke, das ist ein guter Tip.



  • SwitchIO schrieb:

    Xin schrieb:

    Darf ich mal fragen, was in Berlin als PHP-Entwickler mit 10 Jahren Erfahrung so verdient?

    2500,- Eur brutto, da ich nicht studiert habe, sondern nur eine Ausbildung als Elektroniker habe. Bis 900,- EUR netto kann ich runter gehen, denn mehr brauche ich nicht zum Leben.

    Du musst Dich nicht ausnutzen lassen...

    Bzgl. Finanzplanung aber Daumen hoch. Ich kann auch binnen kurzer Zeit auf Hartz IV Level runter, ohne mir Sorgen machen zu müssten. Aber das bedeutet nicht, dass das anstreben würde.

    SwitchIO schrieb:

    Es wäre natürlich schön, wenn ich mit entsprechender Erfahrung dann neu verhandeln könnte.

    C und Assembler ist doch schonmal eine Ansage. Da musst Du aber auch heute noch mit klarkommen. Ich kenne Deinen Lebenslauf und Deine Erfahrungen nicht.
    Wichtig sind Projekte, die einen Einblick geben, dass Du Erfahrungen in dem Bereich hast.

    Was lässt sich denn aus den Erfahrungen in C bauen, wenn man Deine Ausbildung als Elektroniker berücksichtigt?

    Ansonsten suche ich jemanden, der ein Einstiegs-Assembler-Tutorial für proggen.org schreiben kann und will... Geld gibt's dafür nicht, aber bei Bedarf schriftlich, dass Du Dich damit beschäftigt hast. Ob Dir das nutzt, weiß ich nicht, aber wir hatten auch schon jemanden, der aufgrund seines Engagements einen Job angeboten bekommen hat.



  • SwitchIO schrieb:

    Xin schrieb:

    Darf ich mal fragen, was in Berlin als PHP-Entwickler mit 10 Jahren Erfahrung so verdient?

    2500,- Eur brutto, da ich nicht studiert habe, sondern nur eine Ausbildung als Elektroniker habe.

    Ich weiß nicht ob im PHP-Bereich wirklich schlechter als im C++ Bereich bezahlt wird, aber für den Betrag würde ich nicht mit 10 Jahren Erfahrung entwickeln wollen (Habe selbst nur ein abgebrochenes Studium, und keine Ausbildung). Ich liege merklich über deinen Brutto (Es fehlt nicht wirklich viel, das mein Netto dein Brutto erreicht), wohne in keinen Ballungszentrum und weiß das ich noch mehr verdienen kann.

    Beispiel: Wenn ich nicht aktuell in einem Teilzeitstudium wäre, hätte ich mir vor wenigen Tagen ein C# Stellenangebot genauer angeschaut, wo mein jetziges Netto zum Brutto hätte werden können (Selbst bei höherer Miete noch ein gutes Plus).

    SwitchIO schrieb:

    Bis 900,- EUR netto kann ich runter gehen, denn mehr brauche ich nicht zum Leben.

    Bei uns in der Firma haben wir auch jemanden der sich für wenig Geld angeboten hat, doch selbst der hat sich nicht für so wenig verkauft (In seinem Fall hätten wir ihm damals aber auch sonst nicht einstellen können). Zwar gibt es auch einen qualitativen Unterschied zwischen mir und ihm, aber ob das wirklich den prozentualen Gehaltsunterschied (selbst mit inzwischen erfolgten Gehaltsplus) entspricht, ist die andere Frage.

    SwitchIO schrieb:

    Ich habe meine Ausgaben immer so angelegt, dass ich ersten nie Schulden mache und zweitens auch mit Arbeitlosengeld etc. zurecht komme, so habe ich wenig bis gar keine Angriffsfläche für berufliche Veränderungen oder gar Arbeitslosigkeit. Man lebt so einfach viel entpannter und hat eigentlich nie Geldsorgen.

    Zwar ist es immer schön entspannt zu leben, das kann man je nach Firma aber auch mit besseren Gehalt. Such dir eine Firma mit breit gefächerten Kundenkreis, dann ist bei guten Leistungen eine Kündigung auch sehr unwahrscheinlich (Ich kenne beide Extreme: Eine Firma die fast nur an einem Großkunden hing und beim Wegbruch massiv entlassen musste, und meine Aktuelle Firma mit mehr als 40 Kunden, wovon der Größte vielleicht 10% des Umsatzes ausmacht).

    SwitchIO schrieb:

    Alles was mich glücklich macht kostet kein Geld, aber meine Maxime sollen hier kein Thema werden.

    Geld alleine macht nicht glücklich, kann aber das Potential etwas anheben.

    SwitchIO schrieb:

    Es wäre natürlich schön, wenn ich mit entsprechender Erfahrung dann neu verhandeln könnte.

    Das wiederum kannst du eigentlich vergessen. Große Gehaltssprünge erreicht man in der Regel nur beim Wechsel der Arbeitsstelle. Jemand der mit niedrigen Gehalt einsteigt, wird selten erleben das seine Gehaltssprünge besser sind als die der Gutverdiener.



  • Ich danke euch beiden erst einmal für die kompetenten Antworten. Hmm, ein Assembler-Tutorial schreiben. Ist lange her, ich habe damals viel mit 68000er und dann noch ein wenig x86, allerdings nur Realmode, gemacht. Interessant wäre das schon, müsste man mal über das Lernziel und den Umfang reden, da ich erst selbst wieder rein kommen müsste. Aber auf Maschinenebene habe ich schon mal wieder Bock.

    Als Elektroniker, auch wenn das Wissen schon extrem angestaubt ist, fallen mir noch Sachen mit Mikrocontrollern ein, da schnuppere ich privat auch gerade ein wenig rein(AVR und ARM Cortex M3). Aber dort werden meines Wissens mehr Ingenieure gesucht, die natürlich da einiges mehr drauf haben als ich. Ich habe wie gesagt nicht mal ein Informatik-Studium, bin also völliger Autodidakt, der rein durch Bücher lesen, recherchieren und ausprobieren lernt. Ich lerne schon immer des Wissens willens und würde mich da ungern einem Lehrplan wie dem eines Studium hingeben wollen, da ich selbst an besten weiß wo es noch zwackt und dann gezielt lieber selbst lerne. Dafür gibt es halt keinen Titel, aber auch keine Vorgaben.



  • Du musst dem Arbeitgeber klarmachen, dass du in der Lage bist, in absehbarer Zeit verwertbaren C++ abliefern zu können.
    Und wie macht man das einem Arbeitgeber klar? Durch diverse (ähnliche) Projekte, auf die man verweisen kann.
    Das ist bei dir natürlich nicht der Fall.

    Was kannst du tun?
    Nimm dir ein gutes C++ Buch zur Hand ("Die C++ Programmiersprache" oder auch "Der C++ Programmierer", und nach dem du eines der beiden Bücher durch hast liest du dir noch "Effective C++" durch).
    Parallel dazu entwickelst du eine kleine Software in C++, am besten irgendwas das dich interessiert. Da du bisher im Webbereich gearbeitet hast, wäre vielleicht irgendwas in diese Richtung für dich interessant?
    Danach hast du zumindest mal was vorzeigbares. Ab und zu wollen Firmen nämlich, dass man ein paar Sourcecodezeilen anhängen soll von einem Projekt, damit die sehen, wie man programmiert, ob der Code für andere verständlich ist, ob man Memory Leaks erzeugt, ...

    Ich würde dir raten, dein bisheriges Know How, das du durch PHP gesammelt hast, nicht aufzugeben. Immer wieder werden in der Webentwicklung auch C++ Kenntnisse gefordert. Das wäre eventuell deine Chance: du entwickelst zwar dort auch noch ein bisschen PHP, aber durch deine C++ Kenntnisse und durch deine Motivation bleiben immer mehr Aufgaben bei dir hängen, die mit C++ zu tun haben. Nach einiger Zeit kannst du dann wechseln zu einem Job, wo es nur mehr um C++ geht.

    Aber sieh zu, dass du erstmal irgendwo anfängst --> std::cout<<"Hallo Welt!\n";

    P.S.: Zwei Dinge zur Motivation möchte ich dir aber noch mitgeben!
    1.) Lass dir nicht von anderen einreden, dass du es nicht schaffst, von PHP zu C++ zu wechseln. Ich hab vor Jahren auch nur C und keine C++ Erfahrung gehabt und in irgendeinem Forum (wars eh dieses?) wurde mir gesagt, ich solls gleich schon lassen, denn für C++ braucht man Jahre um es zu verstehen. Blödsinn. Ich hab 1-2 Monate C++ gelernt (Bücher+kleine Tools zum Üben), und wäre damals bei allen Jobs genommen worden bei denen ich mich beworben habe. Ich war damals natürlich kein C++ Profi, aber zumindest konnte ich brauchbaren Code abliefern.
    2.) Die alten Hasen kochen auch nur mit Wasser, teilweise haben sie schon Jahre kein Buch mehr in der Hand gehabt. std::vector und std::list kennen die meisten ja noch, std::map machen manche schon einen Bogen drum rum und bei std::set oder std::deque wird man nur blöd angeschaut wenn man diese Namen erwähnt. Diese wichtigen Klassen aus der Standard Bibliothek kennst du allerdings, wenn du deine Bücher gelesen hast.



  • 1500€ ist natürlich schon extrem billig, da werden einige Arbeitgeber schwach 😉 Vor allem, wenn du 10 Jahre Berufserfahrung als Entwickler hast. Du bist ja kein kompletter Anfänger, der keine Ahnung von Computern und Software hat und meint, er hätt sich privat ein bisschen C++ angeschaut. Man sollte davon ausgehen können, dass du dich in dem Bereich auskennst und dich auch in eine neue Sprache reindenken kannst. Wenn du sagst, du willst mit 1500 anfangen und in einem Jahr 2500 verdienen, wenn du dich eingearbeitet hast, würden denke ich einige mitmachen.



  • c++ progger schrieb:

    Ich würde dir raten, dein bisheriges Know How, das du durch PHP gesammelt hast, nicht aufzugeben. Immer wieder werden in der Webentwicklung auch C++ Kenntnisse gefordert. Das wäre eventuell deine Chance: du entwickelst zwar dort auch noch ein bisschen PHP, aber durch deine C++ Kenntnisse und durch deine Motivation bleiben immer mehr Aufgaben bei dir hängen, die mit C++ zu tun haben.

    Dem wollte ich nur mal zustimmen. Ich bin aktuell als C#/C++-Entwickler eingestellt. C# habe ich seit locker drei Jahren nicht mehr gesehen.

    Davor war ich Java-Entwickler und hatte offiziell nix mit C++ zu tun. Zuerst mit Java, dann kam immer mehr C und C++ ins Spiel, wenn es darum ging, Sachen zu implementieren, die Java nicht anbot. Brauchbare C++-Kenntnisse sind schon willkommen.

    Gehaltssprünge machst Du nur mit Jobwechsel. Weiterbildung wird meiner bisherigen Erfahrung nach nicht honoriert, sondern wird als "selbstverständlich" abgetan - egal ob es sich um std::map handelt oder ob man sich in ganz neue Bereiche auf eigene Kosten einarbeiten lässt.



  • @SwitchIO
    Du musst ja nicht gleich €5000 Brutto verlangen, aber €1500 sind viel zu wenig. Damit kommunizierst du nur dass du nicht weisst was ein Programmierer wert ist und/oder dass du dich für sehr schlecht hältst.
    Wenn ich mich richtig erinnere dann kann man einem Programmierer mit 10 Jahren Berufserfahrung in Ö gar nicht so wenig zahlen (kollektivvertraglich festgelegter Mindestlohn). Und in Ö ist das dann noch x14 und nicht x12.

    Ich würde dir empfehlen auf jeden Fall mehr zu verlangen als du momentan bekommst, zumindest €200-300. Runterhandeln lassen kannst du dich immer noch.
    Aber wie oben schon angedeutet: nicht zu weit. Wenn du für so wenig Geld arbeitest, bekommt der Arbeitgeber bloss den Eindruck dass du nix kannst. Was dann trotz des für ihn so "günstigen" Angebots dazu führen kann dass er jmd. anderen nimmt.



  • Vielen Dank für die erneut sehr nützlichen Antworten. Das macht mir doch nun ein wenig Mut. Den Vorschlag, ein paar kleine Projekte in C++ zu machen, halte ich für äußerst sinnvoll. Dann kann der potentielle Arbeitgeber gleich sehen mit welchem Kenntnisstand er es zu tun hat.

    Ich bestelle mir die Woche noch "Einführung in die Programmierung mit C++" von Bjarne Stroustrup, damit ich nochmal von der Pike auf anfangen kann, obwohl ich vieles schon kenne. In meiner Fach-Bibliothek schlummern schon die Werke: "Die C++ Programmiersprache(Bjarne Stroustrup)", "Effektiv C++ Programmieren(Scott Meyers)" und "Notizen zu C++(Peter Thömmes)". Vieles in den zuletzt genannten Büchern verstehe ich zwar, aber es ist doch schon viel Profistoff dabei. Deswegen steige ich nochmal im EG ein und kann ja dann die ganz trivialen Geschichten schneller durchackern.

    Als Projekte werde ich was mit Bildbearbeitung machen, das hat mich schon immer interessiert und da habe ich auch schon mit mit C++/Qt angefangen gehabt und kann ein geladenes Bild in Echtzeit die HSV Parameter per Slider einstellen. Das ist nicht viel, aber das kann ich weiter ausbauen und dann auch zeigen.

    Wenn ihr noch Ideen für kleine Projekte habt, dann immer her damit. Ich werde mit Sicherheit auch die ein oder andere Frage hier zur Implementierung oder auch der Mathematik dahinter hier rein stellen und mich dann auseinander nehmen lassen^^

    Vielleicht kann ich mich dann schon Ende des Jahres irgendwo bewerben. Zur Not würde ich 2 Wochen kostenlose Probearbeiten anbieten, dann kann ich sehe ob es passt und der Arbeitgeber+Kollegen auch. Denn wenn ich was gelernt haben, dann ist es das, dass man Fachwissen dazu lernen kann, aber die Zwischenmenschliche Chemie ist mindestens genauso wichtig und die stimmt oder halt nicht.

    Es wäre toll von dem Webkram weg zu kommen. Ich programmiere nun schon so lange PHP und habe kein einziges Buch darüber, da es mich privat überhaupt nicht interessiert und ich Fachbücher sonst liebe.

    Wenn euch noch was einfällt, dann immer her damit, ansonsten bedanke ich mich für eure Zeit.

    P.S.: @Xin: Das mit dem Assembler-Tutorial verschieben wir dann lieber. Ich will mich jetzt voll auf C++ konzentrieren. Da alles neben der Arbeit laufen muss, würde das nicht sonst nicht gut funktionieren.



  • SwitchIO schrieb:

    Ich bestelle mir die Woche noch "Einführung in die Programmierung mit C++" von Bjarne Stroustrup, damit ich nochmal von der Pike auf anfangen kann, obwohl ich vieles schon kenne. In meiner Fach-Bibliothek schlummern schon die Werke: "Die C++ Programmiersprache(Bjarne Stroustrup)", "Effektiv C++ Programmieren(Scott Meyers)" und "Notizen zu C++(Peter Thömmes)". Vieles in den zuletzt genannten Büchern verstehe ich zwar, aber es ist doch schon viel Profistoff dabei. Deswegen steige ich nochmal im EG ein und kann ja dann die ganz trivialen Geschichten schneller durchackern.

    Da scheint jedenfalls eine Menge brauchbares dabei zu sein. "Notizen zu C++" wollte ich mir auch mal zulegen, der Rest hört so oder so in eine gute Bibliothek eines C++-Entwicklers.

    SwitchIO schrieb:

    Als Projekte werde ich was mit Bildbearbeitung machen, das hat mich schon immer interessiert und da habe ich auch schon mit mit C++/Qt angefangen gehabt und kann ein geladenes Bild in Echtzeit die HSV Parameter per Slider einstellen. Das ist nicht viel, aber das kann ich weiter ausbauen und dann auch zeigen.

    Ich finde das eine sehr gelungene Auswahl.

    SwitchIO schrieb:

    Vielleicht kann ich mich dann schon Ende des Jahres irgendwo bewerben. Zur Not würde ich 2 Wochen kostenlose Probearbeiten anbieten, dann kann ich sehe ob es passt und der Arbeitgeber+Kollegen auch.

    Du bekommst so oder so eine 6 monatige Probezeit in der Du Dich beweisen musst/kannst und in der Dir als Arbeitnehmer steht es sowieso zu, zu kündigen.

    Lerne, dann bewirb Dich als C++-Entwickler. Und dann lerne weiter. Es gibt zu wenige wirklich gute C++-Entwickler.

    SwitchIO schrieb:

    P.S.: @Xin: Das mit dem Assembler-Tutorial verschieben wir dann lieber. Ich will mich jetzt voll auf C++ konzentrieren. Da alles neben der Arbeit laufen muss, würde das nicht sonst nicht gut funktionieren.

    Denke ich mir, aber ich frage immer mal wieder, denn gelegentlich findet sich auch mal einer mal, der mithilft. Nur so hält man solch ein Projekt am laufen. 🙂
    Falls Du unabhängig davon Interesse hast, kannst Du auch die bisher vorhandenen Teile des C++-Tutorial lesen und mich kritisieren. Auch so etwas hilft.
    Eine Verpflichtung gehst Du damit nicht ein.



  • Ich schaue mir gerne dein C++-Tutorial an.



  • SwitchIO schrieb:

    Als Projekte werde ich was mit Bildbearbeitung machen, das hat mich schon immer interessiert und da habe ich auch schon mit mit C++/Qt angefangen gehabt und kann ein geladenes Bild in Echtzeit die HSV Parameter per Slider einstellen. Das ist nicht viel, aber das kann ich weiter ausbauen und dann auch zeigen.

    Wenn ihr noch Ideen für kleine Projekte habt, dann immer her damit. Ich werde mit Sicherheit auch die ein oder andere Frage hier zur Implementierung oder auch der Mathematik dahinter hier rein stellen und mich dann auseinander nehmen lassen^^

    das ist tatsächlich ein interessantes und brauchbares Projekt.
    Sowas ähnliches hab ich auch einmal gemacht.
    Anbei eine Anwendungsidee, du kannst natürlich auch ganz andere Dinge umsetzen, aber du wolltest ja Ideen haben, also hier kommt eine:

    Mach dir zuerst eine Klasse, die zumindest Bitmaps laden und speichern kann (später kannst du sie um JPG, PNG und ähnliches erweitern). Das Bitmap Format ist recht einfach, vor allem wenn du nur 24bit Bitmaps verwendest.
    Du hast damit alle Pixel im Speicher, und kannst dann recht einfach darauf zugreifen, indem du eine Methode hast, die dir den Pixel liefert, den du dann auch verändern kannst.

    Beispielsweise könnte das Interface für die Bildklasse so aussehen:

    // Interface für Image Klassen
    class IImage
    {
    public:
        virtual ~IImage();
    
        virtual bool Load(const std::string& filename) = 0;
        virtual bool Save(const std::string& filename) = 0;
    
        virtual Pixel& PixelAt(uint32_t x, uint32_t y) = 0;
        virtual uint32_t GetWidth() const = 0;
        virtual uint32_t GetHeight() const = 0;
    };
    

    Ein Pixel könnte z.B. so aussehen:

    struct Pixel
    {
        // RGB + Alpha Kanal
        uint8_t red;
        uint8_t green;
        uint8_t blue;
        uint8_t alpha;
    
        // Grauwert
        uint8_t gray;
        bool isGray;
    
        // zusätzliche Daten
        int extraData;
    
        // Mit 0 initialisieren
        Pixel():red(0),green(0),blue(0),alpha(0),gray(0),isGray(false),extraData(0){}
    };
    

    Ich hab aufbauend auf der Bildklasse dann einige Funktionen zur Bearbeitung und Objekterkennung geschrieben.

    // Grenzwert: Graustufen
    void Threshold(IImage& img, uint8_t value);
    
    // Bilder vergleichen
    void DiffImage(IImage& img, IImage& background);
    
    // Graustufen Bild normalisieren, durchschnittlicher Pixelwert=128
    void Normalize(IImage& img);
    
    // ... und viele mehr ...
    

    Eine Anwendung davon war die Erkennung von Personen bei uns im Wohnzimmer mittels Webcam.
    Um von der Webcam Bilder zu bekommen hab ich ein kleines Linuxprogramm (fswebcam) verwendet, welches ein Foto macht und dieses als JPG abspeichert.

    Zuerst einmal ein Foto vom leeren Wohnzimmer gemacht, und als bg.jpg gespeichert.
    Mittels Skript ist dann alle paar Sekunden ein neues Foto namens test.jpg gemacht worden.
    Das Skript hat danach mein Programm aufgerufen, welches nun mit der Objekterkennung startete:

    • beide Bilder in Instanzen der oben angeführten Klasse reinladen
    • Bilder pixelweise in Graustufen umwandeln (gray=x*red+y*green+z*blue)
    • normalisieren um Helligkeitsschankungen auszugleichen (sodass im Schnitt der Graustufenwert bei 128 lag)
    • Pixelweise Differenz beider Bilder bilden, also die Graustufenwerte der beiden Bilder voneinander substrahieren
    • Schwellwert bilden: Ab einem bestimmten Grauwert wird der Pixel weiß, darunter schwarz
    • Nun siehst du sehr schön als weiße Flecken, wo eine Person steht
    • Es gibt aber noch ein bisschen Rauschen im Bild, also glätten wir das Bild indem wir den Mittelwert aus einer Pixelregion (z.B. 9x9 Pixel) bilden
    • Schwellwert nocheinmal bilden: diesmal sind die Objekte viel klarer und mit weniger Rauschen zu erkennen
    • Du kannst nun diese Flecken ("Blobs") versuchen zu erkennen, und speicherst deren Eigenschaften (Position, Breite, Höhe, ...) in einer eigenen Struktur ab. Die einfachste Erkennung von Blobs ist, indem du zu jedem weißen Pixel die direkten weißen Nachbarn suchst, und von denen wieder die weißen Nachbarn, bist du schließlich alle hast und schauen kannst, was xmin,xmax,ymin,ymax, sind.
    • Du kannst nun im Originalbild dort rote Rechtecke um die Stellen zeichnen, wo du die Blobs gefunden hast.
    • Du kannst die Auswahl einschränken, indem du nur Blobs mit bestimmten Eigenschaften markierst, z.B. mit einer Mindestgröße
    • Du speicherst das Bild als out.jpg ab und schon hast du eine Möglichkeit, Menschen mittels Webcam zu erkennen

    Hier ein paar Schritte davon als Bilder:
    http://de.tinypic.com/r/14e2c8m/8
    http://postimg.org/image/iathl6v9p (falls der andere Link nicht funktioniert)

    Natürlich kann man da noch einiges optimieren, aber du siehst, dass man mit einfachen Mitteln bereits recht weit kommt!
    Viel Spaß beim Lernen!



  • c++ progger schrieb:

    Mach dir zuerst eine Klasse, die zumindest Bitmaps laden und speichern kann (später kannst du sie um JPG, PNG und ähnliches erweitern). Das Bitmap Format ist recht einfach, vor allem wenn du nur 24bit Bitmaps verwendest.

    Völlig uninteressant, er hat ja schon geschrieben, dass er Qt verwendet, dass kann all diese Formate (und mehr) von Haus aus. Und selbst ohne Qt gibts zig Bibliotheken, die sowas können. Wer sowas selber schreibt, wird damit keinen beeindrucken, eher im Gegenteil.
    Deine Pixelklasse gefällt mir auch nicht. Ich würd mir da auch auf gar keinen Fall die Grauwerte zusätzlich zu den Farbwerten speichern. Wenn du ein Graustufenbild haben willst, dann konvertierst du dein Farbbild und arbeitest mit der Kopie weiter.
    Was du dann machst, finde ich schon interessanter. Da gibt es sicherlicher wesentlich raffinierte Ansätze, aber wenn du ohne die Theorie und fortgeschrittene Methoden zu kennen etwas brauchbares hinbekommst, finde ich das auf jeden Fall auch interessant und vorzeigbar.



  • Völlig uninteressant, er hat ja schon geschrieben, dass er Qt verwendet, dass kann all diese Formate (und mehr) von Haus aus. Und selbst ohne Qt gibts zig Bibliotheken, die sowas können. Wer sowas selber schreibt, wird damit keinen beeindrucken, eher im Gegenteil.

    vielleicht ists oben nicht klar herausgekommen: bei mir war das ein Lernprojekt für C++. Daher auch das manuelle Laden von Bitmaps. Dadurch konnte ich File IO mit C++ lernen, ohne die üblichen faden Aufgaben wie "lade eine Textdatei und stelle sie auf der Konsole dar" machen zu müssen.
    JPG hab ich später dann per libjpeg eingebunden.
    Für Bitmaps gibts sicher auch irgendeine fertige Lib, wenn man Qt verwendet erübrigt sich die Frage sowieso.

    Was du dann machst, finde ich schon interessanter. Da gibt es sicherlicher wesentlich raffinierte Ansätze, aber wenn du ohne die Theorie und fortgeschrittene Methoden zu kennen etwas brauchbares hinbekommst, finde ich das auf jeden Fall auch interessant und vorzeigbar.

    Danke.
    War selber erstaunt wie viel man machen kann, wenn man erstmal ein paar Datentypen und Funktionen gebastelt hat, die grundlegende Dinge implementieren.
    Schön finde ich beim Thema Bildverarbeitung/Erkennung auch, dass man eben gleich was sieht.



  • Sehr gute Übung, eine Klasse zum Laden von Bilder zu entwerfen. Leider aber tatsächlich nicht sooo motivierend, da ich mit Qt dies schon automatisch mit dabei habe. Die interessanten Formate wie JPG, PNG stelle ich mir schon kernig vor zu implementieren. Das ist kein Grund, es nicht per Hand zu machen, da es sehr viele Sachen für mein Malprogramm schon in Libs gibt(GEGL, OpenCV etc.), aber ich möchte bei solch größeren Projekten schon motiviert bleiben.

    Ich habe mal einen rudimentären 3D-Studio-Max-Loader(undokumentiertes Binärformat) in C geschrieben, vielleicht kann ich den mit C++-Mitteln neu mit einbauen und das Model dann erst einmal nur als Wireframe darstellen.

    So, leider muss ich langsam mit der Arbeit anfangen, PHP ruft(ich kann es nicht mehr sehen). Danke weiterhin für die Tipps und Anregungen.


Anmelden zum Antworten