C -> C#



  • Hallo liebe Programmierer!
    Ich habe eine Freundin die Hilfe bei C# braucht.
    Sie kann C programmieren und möchte ihre C Funktionen in C# überführen.
    Sie scheitert leider daran und hat mich um Hilfe gebeten. Ich kann kein C# (nur C und C++) und versuche jetzt stetig in meiner (wenigen) Freizeit C# zu lernen um ihr zu helfen.

    Es wäre super wenn jemand so nett ist und versuchen kann diese Funktionen von C in C# umzukonvertieren.
    Und noch viel besser wäre es wenn er sogar danach erklären könnte warum es so gemacht wurde und was denn die großen Unterschiede sind 🙂

    Hier erstmal die Funktionen:

    /* Seitenlänge einer Zelle */
    int CELL_WIDTH;
    
    /* berechnet das binäre Muster um der Pixel (X,Y) herum im Bild img */
    uint8_t getPattern(uint8_t *img, int X, int Y) {
            int x, y, i;
            uint8_t pattern = 0;
            int dir_x[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
            int dir_y[8] = {-1, 0, 1, -1, 1, -1, 0, 1};
    
            for (i = 0; i < 8; i++) {
                    x = X + dir_x[i];
                    y = Y + dir_y[i];
                    if (img[y*WIDTH + x] < img[Y*WIDTH + X])
                     {
                            pattern += (1 << i);
                    } else {
                            pattern += (0 << i);
                    }
            }
            return pattern;
    }
    
    /* berechnet das Histogramm in der Zelle (X,Y, X+15, Y+15) im Bild img */
    int *getHistogram(uint8_t *img, int X, int Y) {
            // 8 Nachbarn ==> 2^8 = 256 Patterns
            int *hist = (int *) calloc(256, sizeof(int));
            int x, y, i;
            uint8_t b;
    
            for (y = 1; y < CELL_WIDTH-1; y++) {
                    for (x = 1; x < CELL_WIDTH-1; x++) {
                            b = getPattern(img, X+x, Y+y);
                            hist[b] += 1;
                    }
            }
            return hist;
    }
    
    /* berechnet den Feature Vector des Bildes img, indem die Histogramme der LBPs aneinandergehängt werden */
    int **getFeatureVector(uint8_t *img, int WIDTH, int HEIGHT) {
            int X, Y;
            int cells_x = WIDTH/CELL_WIDTH;
            int cells_y = HEIGHT/CELL_WIDTH;
            int **vector = (int **) malloc(cells_x * cells_y * sizeof(int *));
    
            for (Y = 0; Y < HEIGHT; Y += CELL_WIDTH) {
                    for (X = 0; X < WIDTH; X += CELL_WIDTH) {
                            vector[Y/CELL_WIDTH * cells_x + X/CELL_WIDTH] = getHistogram(img, X, Y);
                    }
            }
            return vector;
    }
    

    Ich glaube es ist nicht wichtig wofür der Code ist um ihn in C# umzuschreiben.
    Aber falls doch:
    Damit soll Texturklassifikation mit dem Einsatz von LBP realisiert werden. Auf sehr einfacher Ebene. Ich kann nur davon Berichten was ich bisher davon verstanden habe.
    Sie beginnt an einer Stelle mit dem generieren von Bildbytes (Das wort ist ausgedacht). Ein Bildbyte enthält Vergleiche von einem Eintrag der Bildmatrix(einem Pixelwert) mit dem Pixelwert eines Nachbarn. Ein Pixel hat 8 Nachbarn => ein Bildwert hat 8 Einträge deswegen das Wort Bildbyte.
    Die Einträge des Bytes sind 1 oder 0. 1 = Vergleichswert ist größer als Bezugswert und 0 sonst.
    Anschließend schreibt sie diese Bytes in einen Vektor und wir sind fertig.

    Wenn noch mehr Informationen gebraucht werden dann einfach fragen.
    Ich freue mich riesig über Hilfe. Ein Zeitgrenze ist erstmal nicht angesetzt. Es wäre schön es diese Woche noch zu schaffen.

    Vielen Dank schonmal an alle die so nett sind und helfen möchten



  • Ehrlich, ich brauch länger, um das umzuschreiben, als man braucht, um C# auf einem dafür ausreichenden Level zu lernen...



  • Sunflower schrieb:

    Sie kann C programmieren und möchte ihre C Funktionen in C# überführen.

    Ich würde mal die Sinnhaftigkeit des Vorhabens hinterfragen. Der Code sieht mir aus als ob es da um irgendwas in Richtung Computer Vision geht. Wenn der Code sowieso schon in C vorliegt, würd ich mich jetzt nicht drauf fixieren das unbedingt nach C# zu konvertieren, da die C Variante potentiell schneller sein wird. Man kann ihn wohl auch in C# schnell bekommen, aber es wird evtl. viel Aufwand sein in C# an die C Lösung ranzukommen. Wenns nicht grad um triviale Algorithmen geht evtl. sogar mehr Aufwand als es einfach in C zu machen, vor allem wird der optimierte C# Code sehr schnell wie C aussehen. Sowas ist eben einfach nicht unbedingt die große Stärke von C#.
    Wieso nicht einfach eine dll bauen und die von C# aus verwenden?



  • Sie soll es in C# machen und nicht in C.
    Ich dachte früher immer das C# eher für Graphische Anwendungen und Oberflächen geeignet sei als für solche Projekte, aber es ist nunmal so dass sie das Projekte in C# implementieren soll.
    Wie lange würdet ihr denn den Zeitaufwand schätzen um C# auf dem level zu erlernen womit man den Code umschreiben könnte?
    Wenn es nicht so viel ist würde ich es vielleicht ernsthaft versuchen.



  • Also der Code ist sicher in 60 Minuten umgeschrieben.

    Da ist ja nichts dran und kann fast 1zu1 übernommen werden.
    Da dauert es länger ein Projekt in VS anzulegen.

    Ich sehe eher das Problem wie sie das alles realisieren will ohne c# zu können.
    Man nimmt doch keine Auftrag an wenn man keine Ahnung hat.



  • Das ist natürlich ein Problem womit sie jetzt zu kämpfen hat.
    Ich habe sie auch schon damit konfrontiert, aber dadurch dass sie damit konfrontiert wird lernt sie auch kein c#
    Deswegen machen wir jetzt erstmal ein Problem nach dem anderen. Erstmal Projekt (Zeitgerecht) beenden und dann Sprache lernen.
    Das Projekt ist von ihrem Dozenten und sie hat 2 davon. Sie studiert in Berlin irgendwas Informatik aenliches.



  • Sunflower schrieb:

    Das ist natürlich ein Problem womit sie jetzt zu kämpfen hat.
    Ich habe sie auch schon damit konfrontiert, aber dadurch dass sie damit konfrontiert wird lernt sie auch kein c#
    Deswegen machen wir jetzt erstmal ein Problem nach dem anderen. Erstmal Projekt (Zeitgerecht) beenden und dann Sprache lernen.
    Das Projekt ist von ihrem Dozenten und sie hat 2 davon. Sie studiert in Berlin irgendwas Informatik aenliches.

    Servus,

    sorry, dass ich das hier schreibe aber das ist völliger Kappes. Wenn sie ein tiefgründiges Verständnis von C hat und den Kram in C# portieren soll, dann ist es, wie schon erwähnt, kein großes Hindernis sich vielleicht 2 Tage (und das ist schon großzügig dimensioniert) hinzusetzen.

    Im Vergleich, hier zu posten und nach zu fragen hat jetzt schon länger gedauert als es zu probieren.

    Wie wäre es, wenn sie es einfach mal versucht und dann konkrete Fragen hier reinstellt. Ich halte es für falsch, dass jemand hier die Hausaufgaben für deine Bekannte machen soll. Sie studiert irgendwas mit "Informatik", dann kann sie sich auch damit auseinander setzen. Dafür studiert man...

    gruß
    Hellsgore


Anmelden zum Antworten