AppDancer

Dance mal wieder richtig App!

Verbinde Dein Smartphone mit dem WLAN „APPDANCER“
Öffne einen Browser (wenn nicht automatisch geöffnet wird) und navigiere auf eine beliebige Seite (z.B. http://dance.app)
Um das Spiel zu starten positioniere Dich vor der Kamera und dann Dance App !
Das Spiel startet automatisch, sobald ein Tanz erkannt wird – also bewegt Euch!
Solltest Du Level fünf oder höher erreichen, wirst Du in die „HALL OF FAME“ aufgenommen!
Viel Spaß beim Abrocken!

Setup:

  • raspberry pi
  • raspbian
  • mjpeg streamer
  • opencv
  • raspicam
  • hostapd
  • dnsmasq
  • WLAN-Antenne

Ein C++ Programm nimmt Bilder von der Raspicam auf und analysiert Bewegung. Bewegung wird als Tanz interpretiert – also bloßes Herumstehen vor der Kamera bringt nichts, man wird zu Hintergrund! Mit einer Background-Subtraction werden die bewegten Bildausschnitte extrahiert und auf dem Bild einer Bühne eingefügt. Das so entstandene Bild wird per WLAN und MJpeg-Stream versendet auf das Smartphone des Nutzers und dort angezeigt. Je höher das Level, also je länger und intensiver getanzt wird, umso psychedelischer werden die Farben.

Ein schöner Spaß für Groß und Klein!

Sourcecode:

In der Bounsrunde regnet´s Konfetti, aber höchstens 9999 zu gleich!

void makeKonfetti(Mat& img, vector<Point>& konfettivec, RNG& rng, bool moreKonfetti) {
			 
	Point pt1;
        int thickness = -1;
	int lineType = 8;	
	if (moreKonfetti && konfettivec.size() < 9999) {
		for (int i = 0; i < 10; i++) {				
			double r = rng.uniform(0., 1.);
			pt1.x = img.cols*r;
			pt1.y = rng.uniform( -1.0*img.rows, 3. );				
			konfettivec.push_back(pt1);					
		}
	}
	
	//first remove obsolette konfetti
	for (int i = 0; i < konfettivec.size(); i++) {	
		if (konfettivec[i].y > img.rows+2 || konfettivec[i].x < -5 || konfettivec[i].x > img.cols+5) {			
			for(vector<Point>::iterator it = konfettivec.begin(); it != konfettivec.end(); it++)
			{
				if (*it == konfettivec[i])
				{
					konfettivec.erase(it);
					break;  //it is now invalid must break!
				}
			}
		}
	}
	
	//now move konfettis
	for (int i = 0; i < konfettivec.size(); i++) {		
		double r = rng.uniform(-2., 6.);
		konfettivec[i].x += r;		
		r = rng.uniform(0.1,7.);		
		konfettivec[i].y += max(r,(konfettivec[i].y/r));			
		r = rng.uniform(1., 3.);
		circle( img, konfettivec[i], r, randomColor(rng), thickness, lineType );		
	}
}

GunImposer

GunImposer ist ein Programm zum Herstellen von Sammelformen. Seine Stärken sind Geschwindigkeit und die Möglichkeit sehr viele Seiten verarbeiten zu können.

Problem:

  • Ein pdf-Dokument mit 9999 Gutscheinen soll gedruckt werden
  • Die Reihenfolge soll erhalten bleiben
  • Die variablen Daten sollen einen komplizierten Hintergrund bekommen
  • Zwischenschnitte müssen definierbar sein
  • Berücksichtigung von Beschnittzugabe
  • Keine Skalierung der Daten vornehmen (wie bei Acrobat Mehrfach-Ausgabe)

Lösung:

Java-Programm GunImposer mit Verwendung der Apache pdfBox-Library. Mit GunImposer erstellt man fertige Druckbögen mit variablen Daten. Mit Acrobat kann man der erzeugten pdf-Datei einen Hintergrund für alle Seiten verpassen. Dadurch wird der Hintergrund nur einmal hinzugefügt wodurch die Dateigröße enorm sinkt, da alle sich wiederholenden Inhalte nur einmal gespeichert werden. Oder man nutzt die pdf ohne Hintergrund und verwendet dann den Variablen Datendruck VDP, wenn man zB Fiery Command WorkStation hat.

Workflow:

  • Bogenformat einrichten
  • Schema Editor für Nutzenanordnung
  • Datei laden (alle Seiten sollten die gleiche Größe haben)
  • Sortierung wählen, so dass Stapel in Reihenfolge gedruckt werden
  • Optional: Seiten duplizieren
  • Optional: Schnittmarken erzeugen
  • Feature: GunImposer speichert die Eingaben und lädt sie beim nächsten Start neu
GunImposer Schema-Editor

Ergebnis:

GunImposer Druckbogen Seite 1
GunImposer Druckbogen Seite 1250

Auf der letzten Seite fehlt ein Nutzen, da das Dokument 9999 Seiten hatte. Die härteste Nuss an dem Programm war die korrekte Sortierung zu erzielen – einem eigentlich einfachen mathematischen Problem.

Sourcecode:

Wie berechnet sich die Anzahl der Druckbögen?

int allNutzen = cols*rows;	    	
int impoPages = (int)Math.ceil((totalPageNum*duplicates) / (float)allNutzen);
getLblFileInfo().setText((totalPageNum*duplicates)+" Seiten zu "+allNutzen+" Nutzen auf "+impoPages+" Druckbogen");

Interesse:

Frag mich nach einer Kopie des Programms.

Visitenkarten Generator

Wir leben in modernen Zeiten, da bleibt dem Ingenieur kaum Zeit zur Gestaltung einer eigenen Visitenkarte. Oder ein Herr Meir bekommt dreimal die falsche Mayer/Meier/Müller-Karte verpasst.  Daher musste ein Tool her um die Probleme zu lösen!

Setup:

  • php
  • javascript (jQuery)
  • xml-parser
  • pdf Erezugung mit tcpdf
  • Color Klasse überschreiben für CMYK-Unterstützung
  • phpmailer (hier deaktiviert) für Nachricht an Bestellung

Hier könnt ihr damit spielen:

  • als User: Test123 Passwort: Test123
  • als Admin: Admin123 Passwort: Admin123

Applausometer

Irgendwann kommt der Tag, da braucht man ein Aplausometer! Bei Ida Nowhere sollte der Super-Singer-SongWriter-Contest steigen. Eine faire Auswertung der Publikumsregungen wäre ohne Aplausometer nicht möglich gewesen! Leider sind nicht alle Künstler gleich ehrlich und manche jubeln selbst ordentlich mit um mehr Punkte abzusahnen.

Applaus Applaus!

Setup:

  • Computer
  • Bildschirm
  • Mikrofon an der Decke
  • Tastatur

Tastenkürzel:

  • Leertaste: Pause an/aus
  • C calibration starten
  • N neue Messung
  • S Messung speichern (Name wird abgefragt und mit dem Applauswert in der Datei scores.txt gespeichert)

Download:

Source:

Die „Magie“ geschieht quasi zur Laufzeit:

public void run()
	{

		byte[]	abBuffer = new byte[m_nExternalBufferSize];
		
		int	nBufferSize = abBuffer.length;		
		
		m_bRecording = true;
		while (m_bRecording)
		{
			while (pause) {
				m_targetLine.read(abBuffer, 0, nBufferSize);
				panel.updateAplause(false);
			}
			
			 m_targetLine.read(abBuffer, 0, nBufferSize);
			
			 if (calib < 99) {
				 for (int j = 0; j < abBuffer.length-1; j+=2) {
						
						pegel = (pegel*(1-gewichtung))+(Math.abs((abBuffer[j+1]<<8)+abBuffer[j]) * gewichtung);
												
						grundrauschen += pegel;
						
					}
				 calib++;
				 grundrauschen = grundrauschen / ((abBuffer.length) / 3.0);				 
			 }
			 else for (int j = 0; j < abBuffer.length-1; j+=2) {
											
						pegel = (pegel*(1-gewichtung))+(Math.abs((abBuffer[j+1]<<8)+abBuffer[j]) * gewichtung);
						
						aplause += Math.max(( (pegel - grundrauschen) / (grundrauschen) ), 0);
						
						if (j%10 == 0) {
							panel.updateAplause(aplause);
						}
												
					}
		}
	}

Squatbox

Mit Navid Tschopp habe ich 2015 eine sogenannte Squatbox entwickelt. Es handelt sich dabei um ein digitales Mahnmahl. Ein Raspberry Pi (zuvor eine PirateBox) stellt eine offene WLAN-Verbindung bereit. Nutzer verbinden sich mit ihren Smartphones und glauben, sie befänden sich im Internet. In Wahrheit wird jede Anfrage mit Inhalten aus der Squatbox bedient, so dass nur die Texte, Bilder, Töne und Videos vom Mahnmal angezeigt werden können und dem Nutzer so die Information „ungefragt“ untergejubelt wird.
Mehr Infos hier: http://www.cabaretvoltaire.ch/de/projekte/invent-the-future-with-elements-of-the-past/navid-tschopp.html

WordPress Theme SquatBox

Setup:

  • Raspberry Pi 1
  • WLAN-Stick mit AP-Mode
  • raspbian
  • hostapd
  • DNS-Server
  • nginx-Webserver
  • WordPress