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 );		
	}
}