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/11/15 20:47] da1l6projekte:vector_graphics_adapter [2017/03/01 19:19] (aktuell) – Externe Bearbeitung 127.0.0.1
Zeile 1: Zeile 1:
-==== VGA: Vector Graphics Adapter ====+{{ :projekte:vga-miku.jpg?direct&200|Vektorgrafikausgabe über den VGA Port auf Oszilloskop}}==== VGA: Vector Graphics Adapter ====
  
 Vektorgrafik auf dem Oszilloskop dürfte so alt sein wie der X/Y-Modus. Neben [[https://de.wikipedia.org/wiki/Lissajous-Figur|Lissajous-Figuren]] erfreut sich die Soundkarte als Quelle für Oszilloskop-Vektorgrafik einiger [[https://www.youtube.com/watch?v=s1eNjUgaB-g|beliebtheit]]. Dabei werden linker und rechter Kanal mit der X bzw. Y Auslenkung des Oszilloskops verbunden und bewegen so den Elektronenstrahl im analogen Oszilloskop. Vektorgrafik auf dem Oszilloskop dürfte so alt sein wie der X/Y-Modus. Neben [[https://de.wikipedia.org/wiki/Lissajous-Figur|Lissajous-Figuren]] erfreut sich die Soundkarte als Quelle für Oszilloskop-Vektorgrafik einiger [[https://www.youtube.com/watch?v=s1eNjUgaB-g|beliebtheit]]. Dabei werden linker und rechter Kanal mit der X bzw. Y Auslenkung des Oszilloskops verbunden und bewegen so den Elektronenstrahl im analogen Oszilloskop.
  
 Eine Soundkarte ist im Prinzip ein Digital-Analog Wandler, hat jedoch Tiefpassfilter welche zwar die Audio-Qualität erhöhen, aber die Geschwindigkeit mit welcher der Elektronenstrahl bewegt werden kann eng limitiert. Außerdem sind in der Regel Koppelkondensatoren verbaut, welche den für Lautspecher schädlichen Gleichstromanteil entfernen. Eine Soundkarte ist im Prinzip ein Digital-Analog Wandler, hat jedoch Tiefpassfilter welche zwar die Audio-Qualität erhöhen, aber die Geschwindigkeit mit welcher der Elektronenstrahl bewegt werden kann eng limitiert. Außerdem sind in der Regel Koppelkondensatoren verbaut, welche den für Lautspecher schädlichen Gleichstromanteil entfernen.
-Dadurch verliert die Grafik jedoch den Nullpunkt und wabert um den Mittelpunkt falls sie nicht gut auf diese Gegebenheiten angestimmt wird.+Dadurch verliert die Grafik jedoch den Nullpunkt und wabert um den Mittelpunkt aller Vektoren falls sie nicht gut auf diese Gegebenheiten angestimmt wird. 
  
-Ziel des Projektes ist eine stabile Ausgabe beliebiger (Vektor-)Grafik zu erreichen.+{{ :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 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 (> 100MHzausgeben, 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.
  
-=== 0. Vektorisierung mit patrace ===+{{ :projekte:vga-scope-adapter.png?200|Verbindung VGA-Port mit Oszilloskop}} ==== Hardware ==== 
 +  * VGA Pin 1 (Rot) mit dem Horizontal Eingang (Meist Ch2) des Oszilloskops verbinden. 
 +  * VGA Pin 2 (Grün) mit dem Vertikal (Y) Eingang (Meist Ch1) des Oszilloskops verbinden. 
 +  * Massen von PC und Oszilloskop verbinden.
  
-Zu allererst muss Material zur Anzeige her. Die Wahl viel auf das Video [[https://www.youtube.com/watch?v=9lNZ_Rnr7Jc|Bad Apple]], welches sich als reines schwarz-weiss-video Video leicht vektorisieren lässt.+==== Funktionsprinzip / Software ==== 
 +  * Die Vektorisierung ist als [[https://mpv.io/|mpv]] video filter implementiert. 
 +  * 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) 
 +    * 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).  
 +    * Dieser Filter basiert auf dem OpenCV FindContours funktionwelche 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 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 Ausgabezeit entsprechend angepasst wird. 
 +    * Je kleiner der Anteil desto schneller überstreicht der Elektronenstrahl die Kante und desto dunkler erscheint Sie. 
 +    * 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 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. 
 +  * Beispiel "Vektor"-Bild zur Ausgabe auf dem VGA-Port: {{:projekte:vga-scope-vector-image.png?800|Ausgabe-Bild zur Anzeige auf dem "Vektor"-Bildschirm.}}
  
-Dazu wird zuerst das Video zunächst in seine Frames zerlegt:+==== Benutzung ==== 
 +  * Zunächst das VGA Timing so einstellen das möglichst wenig störende H-Blanks erzeugt werden: <code>xrandr --newmode scope 26.7  2048 2049 2060 2060 200 200 216 216 +hsync +vsync 
 +xrandr --addmode VGA1 scope 
 +xrandr --output VGA1 --mode scope --right-of <HAUPTBILDSCHIRM></code> 
 +  * ffmpeg (libav besitzt den edgedetect filter nicht) 
 +  * opencv 
 +  * Modifizierter mpv media player: ''git clone https://github.com/da1l6/mpv'' 
 +  * 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> 
 +    * 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 t1 (bzw. low) und t2 (bzw. high) können je nach Material variieren. Einfach ausprobieren. 
 +    * Der Canny-Algorithmus ist sehr Rechenintensiv, deshalb wird das Bild zuerst mit ''--vf scale:w:h'' herunterskaliert.
  
-''ffmpeg -i <Quellvideo> -vf scale=480:--f image2 <Videoframes>-%4d.bmp''+===== Cheating at Vector Graphics Rastergrafik ===== 
 +{{ :projekte:vga-scope-raster.png?200|TV-Testbild Rastergrafik auf Scope ohne Z-Eingang}}
  
-Und dann vektorisiert:+Der bei der Vektorgrafik benutzte Trick zur Helligkeitsänderung kann benutzt werden um Rastergrafik auszugeben.
  
-<code> +Dabei werden die X/Y-Koordinaten (R/G-Farbkanäle) kontinuierlich so erhöht, das der Oszilloskop-Bildschirm zeilenweise überstrichen wird, wie bei einem Raster Monitor.
-for F in <Videoframes>-*.bmp; do +
-  potrace ---flat -t25 -a0 "$F.bmp" -o "$F.svg"; +
-done +
-</code>+
  
-Die Optionen erzeugen ein SVG mit nur einem Pfad welches sich weiterverarbeiten lässt. +Helligkeitsunterschiede werden mittels Geschwindigkeitsänderung erzeugt. Helle Breiche werden langsamer überstrichen als dunkle indem die entsprechnden Koordinaten im "Vektorbild" öfter wiederholt werden.
-Ein Ruby Skript erzeugt schließlich daraus PCM Output:+
  
-{{:projekte:vec-convert-pcm.rb.gz|Vector Convert PCM}}+==== Benutzung ==== 
 +<code>/pfad/zu/build/mpv --fs --geometry=<BREITE-HAUPTBILDSCHIRM>:--loop --vf scale=256:256,vectorraster:width=2048:height=300 <VIDEO></code>
  
-=== 1. Verbesserte Kantenerkennung mit imagemagick === 
  
-Für nicht schwarz-weiße Videos ist die Schwellwerterkennung welche patrace durchführt, nicht zufriedentstellend. +==== Screen Capture ==== 
-Daher kommt als Zwischenschritt wird daher der [[https://de.wikipedia.org/wiki/Canny-Algorithmus|Canny]]-Kantenerkennungsalgorithmus eingeführtWelcher auf den Video-Frames operiert und ein Schwarzweißbild erzeugt auf dem nur die Kanten des Originalbildes enthalten sind.+{{ :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.
  
-<code> +Das funktioniert prinzipiell sowohl im Raster als auch im reinen VektorgrafikmodusDas bild Rechts ist mit dem Rastergrafik modus entstanden.
-for F in <Videoframes>-*.bmp; do +
-  convert "$F" -canny 0x1+15%+20% -negate "$F.sw.bmp" +
-  potrace -s --flat -t25 -a0 "$F.sw.bmp" -o "$F.svg"; +
-done +
-</code>+
  
-=== 2. Atmel Xplain als externen DAC ===+<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>
  
-=== 3VGA Port als DAC ===+Video Eingänge wie TV-Karten oder Webcams lassen sich auch abgreifen: 
 +<code>/path/to/build/mpv tv:// ...</code>
  
-=== 4. Echtzeit Vektorisierung mit opencv ===+===== Digitaloszilloskop =====
  
-=== 5Videowiedergabe mit mpv ===+Wer kein analoges Oszilloskop sein eigen nennt kann auch ein modernes digitales Oszilloskop verwenden, allerdings sind die Darstellungsergebnisse deutlich schlechter. Insbesondere der Rastergrafik-Modus ist kaum zu verwenden.
  
 +Die Ursache liegt darin, dass digitale Oszilloskope periodisch das Eingangssignal abtasten und dann an der zu den gemessenen Spannungen passenden Stelle einen Punkt zeichnen, welcher aber immer die selbe Helligkeit hat. Da das Abtasten nicht synchron zum Pixeltakt des VGA-Ports ist, werden auch viele Zwischenwerte im Übergang zwischen zwei Pixeln gemessen. Dies führt zu starkem "Rauschen" auf dem Bild.
 +
 +{{:projekte:vga-scope-dso.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.1447620465.txt.gz
  • Zuletzt geändert: 2017/03/01 19:04
  • (Externe Bearbeitung)