projekte:vector_graphics_adapter

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
projekte:vector_graphics_adapter [2015/12/12 23:36] – [Digitaloszilloskop] da1l6projekte:vector_graphics_adapter [2024/12/30 12:17] (aktuell) da1l6
Zeile 7: Zeile 7:
  
 {{ :projekte:vga-scope-hallo-welt.png?200|Mehr Vektorausgabe über VGA}} {{ :projekte:vga-scope-hallo-welt.png?200|Mehr Vektorausgabe über VGA}}
-Doch der PC besitzt ja meist noch einen weiteren Digital-Analog-Wandler: Den VGA Anschluss. Eigendlich für Raster-Grafik ge gedacht, lässt er sich prima zur Ausgabe von Vektorgrafik zweckentfremden. Von den 3 Analogen Kanälen (Rot, Grün und Blau). Werden zwei genutzt um den Elektronenstrahl des Oszilloskops in X bzw. Y Richtug auszulenken.+Doch der PC besitzt ja meist noch einen weiteren Digital-Analog-Wandler: Den VGA Anschluss. Eigendlich für Raster-Grafik gedacht, lässt er sich prima zur Ausgabe von Vektorgrafik zweckentfremden. Von den 3 analogen Kanälen (Rot, Grün und Blau) werden zwei genutzt um den Elektronenstrahl des Oszilloskops in X bzw. Y Richtug auszulenken.
 Der VGA-Port kann die Bilddaten auch mit sehr hoher Geschwindigkeit (> 100MHz) ausgeben, davon kann man bei Soundkarten nur träumen. Auch stöhrende Ausgangsfilter gibt es nicht. Damit ist er fast ideal für komplexe Vektor-Darstellungen geeignet. Der VGA-Port kann die Bilddaten auch mit sehr hoher Geschwindigkeit (> 100MHz) ausgeben, davon kann man bei Soundkarten nur träumen. Auch stöhrende Ausgangsfilter gibt es nicht. Damit ist er fast ideal für komplexe Vektor-Darstellungen geeignet.
  
Zeile 16: Zeile 16:
  
 ==== Funktionsprinzip / Software ==== ==== Funktionsprinzip / Software ====
-  * Die Vektorisierung ist als [[https://mpv.io/|mpv]] video filter implementiert.+  * Die Vektorisierung ist als [[https://mpv.io/|mpv]] video filter in einem [https://gitlab.warpzone.ms/da1l6/vga|Fork] implementiert.
   * Das Video (oder Bild) wird mittels [[https://de.wikipedia.org/wiki/Canny-Algorithmus|Canny Kantenerkennung]] in ein Kantenbild umgerechnet.    * Das Video (oder Bild) wird mittels [[https://de.wikipedia.org/wiki/Canny-Algorithmus|Canny Kantenerkennung]] in ein Kantenbild umgerechnet. 
-    * Dazu habe ich in einen [[https://github.com/da1l6/mpv|mpv fork]] den [[http://opencv.org/|OpenCV]]-Canny Algorithmus als Video Filter eingebaut (-vf canny) +  * Dazu wird der edgedetect Filter aus ffmpeg/libavfilter verwendet (-vf lavfi=edgedetect)
-    * Alternativ kann der edgedetect Filter aus ffmpeg/libavfilter verwendet werden (-vf lavfi=edgedetect)+
   * Anschließend wird ein weiterer Videofilter nachgeschaltet, welcher das Kantenbild in eine Vektorfolge umrechnet. (-vf vector).    * Anschließend wird ein weiterer Videofilter nachgeschaltet, welcher das Kantenbild in eine Vektorfolge umrechnet. (-vf vector). 
     * Dieser Filter basiert auf dem OpenCV FindContours funktion, welche die Kanten als Vektor-Pfad extrahiert.     * Dieser Filter basiert auf dem OpenCV FindContours funktion, welche die Kanten als Vektor-Pfad extrahiert.
-  * Der Vektorpfad wird anschließend als "Vektorbild" ausgegben, dabei entspicht Rot dem X und Grün dem Y Wert des Vektors. Die im Vektorbild verfügbaren Pixel werden auf die Vektoren Anteilsmäßig aufgeteilt.+  * Der Vektorpfad wird anschließend als "Vektorbild" ausgegben, dabei entspicht Rot dem X und Grün dem Y Wert des Vektors. Die im Vektorbild verfügbaren Pixel werden auf die Vektoren anteilsmäßig aufgeteilt.
   * Der ffmpeg edgedetect Filter liefert einen Intensitätswert, welcher die Ausgeprägtheit der Kante repräsentiert.   * Der ffmpeg edgedetect Filter liefert einen Intensitätswert, welcher die Ausgeprägtheit der Kante repräsentiert.
-    * Bei der Umsetzung in das Vektorbild wird dies berücksichtigt indem der Anteil an der koordinaten an der Ausgabe entsprechend angepasst wird.+    * Bei der Umsetzung in das Vektorbild wird dies berücksichtigt indem der Anteil an der Koordinaten an der Ausgabezeit entsprechend angepasst wird.
     * Je kleiner der Anteil desto schneller überstreicht der Elektronenstrahl die Kante und desto dunkler erscheint Sie.     * Je kleiner der Anteil desto schneller überstreicht der Elektronenstrahl die Kante und desto dunkler erscheint Sie.
-    * Damit ist möglich die Helligkeit auch ohne Z-Eingang verändern. +    * Damit ist es möglich die Helligkeit auch ohne Z-Eingang verändern. 
-  * In der unteren linken Ecke (0,0) erscheint ein heller Punkt, dies ist Folge der Austastlücken ("H/V-Blank").+  * In der unteren linken Ecke (0,0) erscheint ein heller Punkt, dies ist eine Folge der Austastlücken ("H/V-Blank").
     * Um den Phosphor des Oszilloskop zu schonen sollte dieser außerhalb des sichtbaren Bereiches der Röhre bewegt werden.     * Um den Phosphor des Oszilloskop zu schonen sollte dieser außerhalb des sichtbaren Bereiches der Röhre bewegt werden.
   * Beispiel "Vektor"-Bild zur Ausgabe auf dem VGA-Port: {{:projekte:vga-scope-vector-image.png?800|Ausgabe-Bild zur Anzeige auf dem "Vektor"-Bildschirm.}}   * Beispiel "Vektor"-Bild zur Ausgabe auf dem VGA-Port: {{:projekte:vga-scope-vector-image.png?800|Ausgabe-Bild zur Anzeige auf dem "Vektor"-Bildschirm.}}
Zeile 35: Zeile 34:
 xrandr --addmode VGA1 scope xrandr --addmode VGA1 scope
 xrandr --output VGA1 --mode scope --right-of <HAUPTBILDSCHIRM></code> xrandr --output VGA1 --mode scope --right-of <HAUPTBILDSCHIRM></code>
-  * ffmpeg (libav besitzt den edgedetect filter nicht) +  * ffmpeg 
-  * opencv +  * opencv3 
-  * Modifizierter mpv media player: ''git clone https://github.com/da1l6/mpv''+  * Modifizierter mpv media player: ''git clone https://gitlab.warpzone.ms/da1l6/vga.git''
   * Beispielaufruf:   * Beispielaufruf:
-    * Mit ffmpeg Kantenerkennung:<code>/pfad/zu/build/mpv --fs --geometry=<BREITE-HAUPTBILDSCHIRM>:0 --loop --vf scale=576:512,lavfi=[edgedetect=high=0.04:low=0.03],vector:width=2048:height=200 <VIDEO></code> +    * <code>/pfad/zu/build/mpv --fs --geometry=<BREITE-HAUPTBILDSCHIRM>:0 --loop --vf scale=576:512,lavfi=[edgedetect=high=0.04:low=0.03],vector:width=2048:height=200 <VIDEO></code> 
-    * Mit openCV Kantenerkennung:<code>/pfad/zu/build/mpv --fs --geometry=<BREITE-HAUPTBILDSCHIRM>:0 --loop --vf scale=576:512,canny:t1=128:t2=130,vector:width=2048:height=200 <VIDEO></code> +    * Die optimalen werte für low und high können je nach Material variieren. Einfach ausprobieren.
-    * Die optimalen werte für t1 (bzw. lowund t2 (bzw. highkönnen je nach Material variieren. Einfach ausprobieren.+
     * Der Canny-Algorithmus ist sehr Rechenintensiv, deshalb wird das Bild zuerst mit ''--vf scale:w:h'' herunterskaliert.     * Der Canny-Algorithmus ist sehr Rechenintensiv, deshalb wird das Bild zuerst mit ''--vf scale:w:h'' herunterskaliert.
  
Zeile 56: Zeile 54:
 <code>/pfad/zu/build/mpv --fs --geometry=<BREITE-HAUPTBILDSCHIRM>:0 --loop --vf scale=256:256,vectorraster:width=2048:height=300 <VIDEO></code> <code>/pfad/zu/build/mpv --fs --geometry=<BREITE-HAUPTBILDSCHIRM>:0 --loop --vf scale=256:256,vectorraster:width=2048:height=300 <VIDEO></code>
  
 +
 +==== Screen Capture ====
 +{{ :projekte:vga-scope-raster-smb1.jpg?200|Super Mario Bros. 1 auf Scope}} mpv kann mit Hilfe von ffmpeg den Bildschirminhalt aufzeichnen. Damit lassen sich (z.B. Spiele) auf dem Oszilloskop darstellen.
 +
 +Das funktioniert prinzipiell sowohl im Raster als auch im reinen Vektorgrafikmodus. Das bild Rechts ist mit dem Rastergrafik modus entstanden.
 +
 +<code>/path/to/build/mpv av://x11grab::0 --demuxer-lavf-o='video_size=<BREITE>x<HÖHE>,grab_y=<XPOS>,grab_x=<YPOS>,framerate=30' ...</code>
 +
 +Video Eingänge wie TV-Karten oder Webcams lassen sich auch abgreifen:
 +<code>/path/to/build/mpv tv:// ...</code>
  
 ===== Digitaloszilloskop ===== ===== Digitaloszilloskop =====
Zeile 65: Zeile 73:
 {{:projekte:vga-scope-dso.png?250 |DSO zur Darstellung}} {{:projekte:vga-scope-dso.png?250 |DSO zur Darstellung}}
 {{:projekte:vga-scope-dso2.png?250 |DSO zur Darstellung}} {{:projekte:vga-scope-dso2.png?250 |DSO zur Darstellung}}
 +
 +=== DSO Tipps: ===
 +  * Eine hohe Bildwiederhohlrate einstellen (z.B. 120Hz) um den Pixeltakt zu erhöhen und damit die Zeit "zwischen" den Pixeln zu reduzieren.
 +  * Ein möglichst breites Seitenverhältniss verwenden um wenig H-Blanks zu haben (ist immer gut).
 +  * Geringe Speichertiefe einstellen (e.g. ~7kPoints).
 +  * Mit der Samplerate rumspielen bis so wenig "rauschen" wie möglich sichtbar ist.
 +
 +===== Unsere anderen VGA-zu-Oszilloskop Projekte =====
 +  * [[https://github.com/ands/vga2scope|Ein auf OpenCV basierender Video Player/Webcam Streamer]]
  • projekte/vector_graphics_adapter.1449963384.txt.gz
  • Zuletzt geändert: 2017/03/01 19:04
  • (Externe Bearbeitung)