Threads mit QtConcurrent



    1. ich hoffe du hasst die vectoren vorher reserved 🙂

    2. Du bekommst als Ergebniss deiner ReadPixelData funktion genau was ?
      So wie ich es sehe das bild in die RGB Komponenten gesplittet .... dein m_redValues, m_greenValues, m_blueValues
      (schau dir mal cv::split an)

    was ich noch ned ganz verstehe ist cv::plot::Plot2d::create(data);
    data ist in deinem Fall der RotKanal vom Bild ....

    wenn den so plotten willst, wird deine X zu column + row * column vom bild, und Y wird der Farbwert da ....
    Glaub nicht das es das ist was du haben willst 🙂



  • Hi,

    @RHBaum sagte in Threads mit QtConcurrent:

    ich hoffe du hasst die vectoren vorher reserved

    Das habe ich noch nicht gemacht. Würde ich aber einbauen wenn das ganze Gerüst erstmal steht.

    @RHBaum sagte in Threads mit QtConcurrent:

    Du bekommst als Ergebniss deiner ReadPixelData funktion genau was ?

    Über ReadPixel greife ich auf einzelnen Vektoren zu. m_redValues speichert ja die Pixelwerte für Rot und den Vektor übergebe ich dann an die Plot2D Funktion. Ich habe aber schon gemerkt das Plot2D ungeeignet ist, da man damit nicht drei Graphen in einem Koordinatensystem zeichnen kann.
    Probiere das Extrahieren nun mit der cv::split und das zeichnen mit cv:line.



  • @makopo sagte in Threads mit QtConcurrent:

    Das habe ich noch nicht gemacht.

    Ich hoffe mit der Zeit wird das auch bei Dir zum reflex 🙂 Vector wird groß, du weisst die größe -> reserven

    Probiere das Extrahieren nun mit der cv::split

    Der Unterschied zu deiner Methode: cv::split liefert eine Matrix2D statt einem reinem array (vector)
    da ist der unterschied, die matrix kennt ihre X dimensionen, der vector kennt keine (hat nur 1) ... Aber die Daten selber sollten gleich sein.
    Vorteil der Matrix , du kannst SIe in OpenCV direkt anzeigen, dann siehst dein Bild als Farbkanal ....

    Bin nicht sicher ob die cv Matrix2D einen linearen zugriff hat (hab lange nix mehr mit openCV gemacht), wenn nicht muesstes deinen Index in zeile,spalte umrechenen, sollte kein Problem sein, da die Dimensionen ja kennst (damit wie aufn vector zugreifen kannst).

    Ich verstehe immer noch nicht, was du fürn diagram zeichnen willst ....
    Die y Achse soll dein red farbwert sein ... (und grü und blau) aber was soll die X Achse sein ....

    Wenn das einm klassisches Farb Histogramm werden soll, dann ist deine X Achse der Helligkeitswert (von 0 - 1) und nix was von der Pixelpostion (row/column) abhängig ist
    Da wirst noch bissi rechnen dürfen ....

    Ciao ...



  • @RHBaum sagte in Threads mit QtConcurrent:

    Ich verstehe immer noch nicht, was du fürn diagram zeichnen willst ....
    Die y Achse soll dein red farbwert sein ... (und grü und blau) aber was soll die X Achse sein ....

    Ich bin in der Testphase. Wichtig ist für mich erstmal das ich Werte/Grafiken einlesen und in der GUI darstellen kann. Das der Graph dann erstmal keinen Sinn macht, ist mir relativ egal. Für mich war es als Anfänger, ohne Skript und Vorgabe, erstmal ein Erfolgserlebnis die Pixelwerte als Graph in der GUI ausgeben zu können.

    Ein Histogramm benötige ich allerdings auch, aber hier gibt es für OpenCv ja aber eine relativ gutes Tutorial.

    Wenn ich nach dieser Definition gehe, dann wäre die x-Achse die Zeit und die y-Achse der Wertebereich von 0 - 255. Und genau das möchte ich später auch abbilden.



  • @makopo sagte in Threads mit QtConcurrent:
    Ich verstehe dein Ansinnen das Lernen mit was konkretem praktischen Verbinden zu wollen.

    Aber ich bin immer noch der Meinung, das man zum Lernen von Grundlagen (Sprache, allgemeine Algorithmic, Abstraktion) nicht gleich mit Rendern/ComputerVision anfangen sollte.
    Hier macht man eben vieles anders / Speziell um spezielle Hardware auszunutzen. Das wiederum bedeuted, das man mehr in asynchronen Mustern "denken" muss.
    Auch wenn Dein Beispiel hier schon fast das "Hallo World" in der Bildverarbeitung ist, fällts halt doch schwer die Grundlagen dahinter zu erklären.

    Was Du konkret willst, ist mit den richtigen Biblios nen 3 Zeiler quasi ... und im produktiven Umfeld sollte man das auch nutzen. Aber Lernen würdest dabei halt auch sehr wenig ....

    Grundlagen der BildVerarbeitung / Computervision Theorie hingegen solltes sprachneutral lernen und um das praktisch anzuwenden / testen gibts einfachere Sprachen ...



  • @RHBaum

    Was das Erlernen der Grundlagen angeht gebe ich dir absolut recht. Das merke ich schon an Themen wie dem Threading.
    Es handelt es sich hierbei jedoch um ein praktisches Projekt fürs Studium, das ich mir zwar selbst ausgesucht habe (wegen Herausforderung und so), bei dem ich aber keinerlei fachliche Hilfestellung und mit Ausnahme von C++ als Programmiersprache keinerlei Vorgaben durch irgendwen erhalten habe (wahrscheinlich weil es zu speziell ist). Mit Ausnahme dieses Internetz von dem immer alle reden...

    Und so habe ich mir meine Frameworks zusammengestellt, einen Haufen selbst recherchierter Unterlagen vor mir liegen und versuche das irgendwie zu wuppen. Wobei andere sicherlich auch so mit dem programmieren angefangen haben, könnte ich mir vorstellen.

    Vielleicht das nur zur Erklärung (sry fürs Offtopic)...



  • ok, dann ist die Problemstellung auch eine andere ... also Praktikablität ist zweitrangig.

    Dann aber trotzdem generell, die Vektoren bräuchtest du nur, wenn du die werte in der binären Form vorliegen haben muesstest, zum beispiel wenn du eine lib damit befeuerst (darstellen etc willst).

    Was du aber eher brauchst sind "Akkumulatoren" . (Summe, Mittelwert, Abstand zu einem Bestimmten Punkt ...)

    Also ich würd mal damit anfangen, versuchen den Durchschnittlichen Rot/Grün/Blau Wert für ein ganzes Bild (Frame) zu berechnen.
    Dann kannst du Dich mal mit der Helligkeit (Grauwert) beschäftigen .... weil für Bildverarbeitung ist der Farbwert im Verhältis zur Heligkeit oft wichtiger ist als der absolute Farbwert.

    Das Ganze dann ohne kopieren der einzelnen Farbkanäle usw. am besten nur mit dem Bild + speicher für laufvariable und speicher für Ergebnisse. (fast nichts ist schlimmer für die Performance, als wenn man zur laufzeit des Algos dynamisch speicher allokieren muss).

    dann das ganze schon als STL Algo (std::for_each), damit es generischer und unabhängiger von den libs wird ...

    Dann koennte man mal die ergebnisse Plotten mit Durchschnittlicher Farbwert pro zeit, was bei fixen frameraten nimmer so schwer ist.

    Als Nächstes koennte man überlegen, ob es lohnt die Akku funktion zu parallelisieren...

    Wobei andere sicherlich auch so mit dem programmieren angefangen haben, könnte ich mir vorstellen

    Ja, aber gleich mit sowas ?
    Ich hab angefangen mit Basic (bin also kein guter C++ Entwickler 🙂 ) auf nem Z80 Clone.
    Meine ersten Programme waren eher für Lagerhaltung ....


Anmelden zum Antworten