Archief - [AS3/C++/OpenCV] Project: Simulatie met Face Tracking

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Flipkikker

Legacy Member
Inleiding

Deze thread dient om de voortgang van het project te presenteren en om jullie feedback op men broncode te ontvangen, handige links, informatie, hulp, kritiek,... :)

Als nieuweling op dit subforum mij even voorstellen:
- ongeveer 8 jaar geleden beginnen prutsen met C/C++/Java/Visual Basic onder vorm van zelfstudie, rond 13-14 jarige leeftijd...
- studeer momenteel ProductOntwikkeling 1e Ma
- nooit scholing gehad ivm programmeren

Zijn nu bezig met een ontwerpopdracht waarvan we een prototype willen afleveren, inclusief software. Aangezien ik het leuk vind om algoritmes te bedenken en programmeerervaring op te doen zou ik me hieraan wagen.

Project

Exacte interface/interactie wordt nog uitgewerkt door een medestudent, maar om het programmeren op te starten moet ik al een simulatie maken waarbij de herkenning van de hoofdbewegingen door een operator gedaan wordt met de pijltjestoetsen. Inladen van de data moet ook nog niet.
1e stap is dus meer een tech demo, die als basis dient voor een test met proefpersonen binnen de komende 2 weken.

Aangezien ik te weinig ervaring heb met grafisch programmeren in C++ heb ik voor de eerste stap besloten in Flash AS3 te werken. Wat googlen leerde mij ook dat OpenCV Face Recognition al geport is naar AS3, dus misschien zal de finale versie van het prototype volledig in Flash zijn.
Hoe dan ook, de code zal ruwweg uitwisselbaar zijn tussen AS3 en C++.

Om de code efficiënter en uitbreidbaar te maken ga ik proberen netjes OO te programmeren, dus de eerste stap is ook alle benodigde klassen/functies/variabelen in beeld te brengen.

Enkele onderdelen zullen ook pas later uitgewerkt worden, om de demo nu eenvoudiger te maken.

Deadline is donderdagochtend, maar aangezien ik woensdag weinig tijd heb ga ik proberen de demo vanavond "af" te hebben.

Updates volgen in de loop van de avond :applause:

Flipkikker

Legacy Member
Ben even de classes aan het uitschrijven,
daarbij iets "verwarrend" tegengekomen:
de new operator

Moet je deze verplicht gebruiken?

Bvb:
Code:
private var question:String; // Correct?
private var question:String = new String(); // Beter? Wat is het verschil?

Bijkomend vraagje:

Indien ik argumenten meegeef in AS3, moet ik ze dan vooraf declareren?
Ik verwacht bij de constructor van men MCQuestion class bvb soms 2 antwoorden, soms 6,...

Dan heb ik 2 opties, of is de 2e foutief of af te raden?
Of maakt het helemaal niet uit?

Code:
public function MCQuestion (q:String, a:Array):void
{   question = q;
    answers = a;
}

OF

Code:
public function MCQuestion ():void
{   if(arguments.length > 2)
    {   question = arguments.shift();
        for each(var s:String in arguments)
        {   answers.push(s);
        }
    }
}

kwitters

Legacy Member
Flipkikker zei:
Code:
private var question:String; // Correct?
private var question:String = new String(); // Beter? Wat is het verschil?

In AS3 zijn alle object variables eigelijk pointers, dus
private var question:String;
is eigelijk hetzelfde als:
private var question:String = null;

De new operator gebruik je dus om een object te instantieren, en heb je dus nodig als je er effectief iets mee wil doen.

Basistypes zoals int of number hoef je niet te instantieren en gedragen zich gewoon zoals in C++.

Flipkikker

Legacy Member
kwitters zei:
In AS3 zijn alle object variables eigelijk pointers, dus
private var question:String;
is eigelijk hetzelfde als:
private var question:String = null;

De new operator gebruik je dus om een object te instantieren, en heb je dus nodig als je er effectief iets mee wil doen.

Basistypes zoals int of number hoef je niet te instantieren en gedragen zich gewoon zoals in C++.

Thx, best dus meteen "= new String();" gebruiken.

Heb hierboven ook een vraagje toegevoegd btw, had niet zo snel een antwoord verwacht :D

Flipkikker

Legacy Member
Architectuur v1

Eerste aanzet tot structuur,
zal waarschijnlijk nog wel wat wijzigen, maar voorlopig probeer ik hiermee alle classes en functions te definiëren, geeft ook een overzicht van het werk... :)

Simulatie%20v1.jpg

Laatste update: 2010/03/10 - 3:10

Verduidelijking:

Het Data package kan ik nog eenvoudig houden door enkel het MCQuestion object te maken en wat basisfunctionaliteit te voorzien.

Face Tracking wordt in later stadium pas toegevoegd.

Om het geheugengebruik wat efficiënter te houden wordt niet de gehele enquête meteen in grafische objecten gegoten, maar worden enkel de zichtbare vragen en antwoorden telkens voorzien van de extra informatie (coördinaten, shaders, movie object,...) en worden deze na hun gebruik onmiddellijk vervangen door de volgende vragen in de rij...
Daarvoor dient dan het VisibleQuestion en VisibleAnswer object, die in het Framebuffer object bijgehouden worden. Kunnen 3 vragen tegelijk zijn op het scherm, of meer, of minder, zal afhangen van de tijd tussen opeenvolgende vragen enzo.

Het World Package bevat de zogezegde defines (als je vergelijkt met C++),
de basisconstanten zoals snelheid etc, snel aanpasbaar op 1 plaats, zodatk niet de hele code moet doorzoeken als ik de voortbewegingssnelheid, cameralens, framerate,... wil wijzigen :)

Flipkikker

Legacy Member
Zal voorlopig zonder de "packages" werken, maar alles in 1 as3 bestand moeten steken. Moet namelijk in de functies van Graphics package ook de informatie hebben uit de Data package...

Zal nog moeten uitvissen hoe ik die wat onafhankelijker van elkaar kan programmeren zonder extra stappen of overbodige functies...
Tips of ideeën?

Voorlopige code volgt, maar zal vanavond niet af zijn dus.
Zal morgennamiddag moeten verderdoen, deadline wordt dan 19u ongeveer...

Flipkikker

Legacy Member
Tussenstand 1: ruwe structuur geprogrammeerd


PHP:
/*********
SIMULATION v1
*********/

/***
WORLD PACKAGE
***/



/***
END OF WORLD PACKAGE
***/

/***
DATA PACKAGE
***/

public class Topic
{
	// variables
	private var _question:String = new String();
	private var _answers:Array = new Array();
	
	//functions
	public function get question():String
	{
		return _question;
	}
	public function get answers():Array
	{
		return _answers;
	}
	
	//constructor
	public function Topic(q:String, a:Array):void
	{
		_question = q;
		_answers = a;
	}
}

public class Survey
{
	// variables
	private var _topics:Array = new Array();
	
	// functions
	public function get topics():Array
	{
		return _topics;
	}
	public function pushTopic(t:Topic):void
	{
		_topics.push(t);
	}
	
	// constructor
	public function Survey():void
	{		
	}
}

/***
END OF DATA PACKAGE
***/

/***
GRAPHICS PACKAGE
***/

public class Vertex
{
	// variables
	private var _x:float;
	private var _y:float;
	private var _z:float;
	// functions
	public function set x(xx:float):void
	{
		_x = xx;
	}
	public function set y(yy:float):void
	{
		_y = yy;
	}
	public function set z(zz:float):void
	{
		_z = zz;
	}
	public function get x():float
	{
		return _x;
	}
	public function get y():float
	{
		return _y;
	}
	public function get z():float
	{
		return _z;
	}

	// constructor
	public function Vertex(xx:float = 0, yy:float = 0, zz:float = 0):void
	{
		_x = xx;
		_y = yy;
		_z = zz;
	}
}

public class Camera extends Vertex
{
	// variables
	private var _roll:float;
	private var _pitch:float;
	private var _yaw:float;
	
	// functions
	public function set roll(rroll:float):void
	{
		_roll = rroll;
	}
	public function set pitch(ppitch:float):void
	{
		_pitch = ppitch;
	}
	public function set yaw(yyaw:float):void
	{
		_yaw = yyaw;
	}
	public function get roll():float
	{
		return _roll;
	}
	public function get pitch():float
	{
		return _pitch;
	}
	public function get yaw():float
	{
		return _yaw;
	}
	
	// constructor
	public function Camera(xx:float = 0, yy:float = 0, zz:float = 0, rroll:float = 0, ppitch:float = 0, yyaw:float = 0)
	{
		_x = xx;
		_y = yy;
		_z = zz;
		_roll = rroll;
		_pitch = ppitch;
		_yaw = yyaw;
	}
}

public class TextShape  // kan zowel een VQuestion als een VAnswer mee gemaakt worden
{
	// variables
	private var _reference:uint;
	private var _text:String = new String();
	private var _wo:Vertex = new Vertex();		// prefix w = world coordinates
	private var _ww:float;
	private var _wh:float;
	private var _co:Vertex = new Vertex();		// prefix c = camera coordinates
	private var _cw:float;
	private var _ch:float;	
	private var _shape:String = new String();
	
	// functions
	private function calcwWidth():void
	{
		// _ww =  > nog uitwerken, berekenen adhv text string en font size uit world package
	}
	private function calcwHeight():void
	{
		// _wh =  > nog uitwerken, berekenen adhv font size uit world package
	}
	public function set wo(wwo:Vertex):void
	{
		_wo = wwo;
	}
	public function set co(cco:Vertex):void
	{
		_co = cco;
	}
	public function set cw(ccw:float):void
	{
		_cw = ccw;
	}
	public function set ch(cch:float):void
	{
		_ch = cch;
	}
	public function get reference():uint
	{
		return _reference;
	}
	public function get wo():Vertex
	{
		return _wo;
	}
	public function get co():Vertex
	{
		return _co;
	}
	public function get cw():float
	{
		return _cw;
	}	
	public function get ch():float
	{
		return _ch;
	}
	public function get shape():String
	{
		return _shape;
	}
	public function calcCCoordinates(ccamera:Camera):void
	{
		// nog uitwerken, hierin komt de matrixtransformatie die de wereldcoördinaten omzet naar de cameracoördinaten
	}

	// constructor
	public function TextShape(rreference:uint, ttext:String, sshape:String = "Rectangle"):void
	{
		_reference = rreference;
		_text = ttext;
		_shape = sshape;
		calcwWidth();
		calcwHeight();
	}
}

public class VTopic
{
	// variables
	private var _reference:uint;
	private var _vquestion:TextShape;
	private var _vanswers:Array = new Array();
	
	// functions
	public function get reference():uint
	{
		return _reference;
	}
	public function calcCCoordinates(ccamera:Camera)
	{
		_vquestion.calcCCoordinates(ccamera);
		for (int i = 0; i < _vanswers.length; i++)
		{
			_vanswers[i].calcCCoordinates(ccamera);
		}
	}
	
	// constructor
	public function VTopic(rreference:uint, squestion:String, sanswers:Array):void
	{
		_reference = rreference;
		_vquestion = new TextShape(rreference, squestion, "Rectangle");
		for (int i = 0; i < sanswers.length; i++)
		{
			_vanswers[i] = new TextShape(i, sanswers[i], "Ellipse");
		}
	}
}

public class FrameBuffer  // bevat de Topics die op dat moment zichtbaar zijn en beheert de berekeningen en drawfuncties (timing event zorgt voor voortgang, terwijl bij de interaction package de achterliggende variabelen gewijzigd worden > moeten toegankelijk zijn)
{
	// variables
	private var _vtopics:Array = new Array();
	
	// functions
	
	// constructor
	
}

/***
END OF GRAPHICS PACKAGE
***/

/***
INTERACTION PACKAGE
***/

// Keystroke event handling

// Action handling (moet input van keystrokes en face tracking op dezelfde manier ontvangen)

/***
END OF INTERACTION PACKAGE
***/

/*
blueprint class:

public class xx
{
	// variables
	
	// functions
	
	// constructor
}

*/

Moet vooral de laatste classes nog eens goed herbezien en corrigeren, want die had ik nog niet zo doordacht (en dat merk je).
Opmerkingen over fouten, structuur, vereenvoudigen,... zeker welkom! ;)

Morgen eerst de keystroke event handler maken en dan in 1x die soep met de beweging en beheer van die objecten oplossen.

C/P eventueel naar je IDE om met genummerde lijnen erdoor te kunnen scrollen, wordt spijtig genoeg niet onmiddellijk gedaan op dit forum...

MAXXUR

Legacy Member
Oei, alles in 1 AS3 file. :p
De manier om OO te programmeren in AS3 is een "document class" te definieren in uw document properties, die de allereerste aanroep zal zijn in uw .swf executie en dus het eerste kind van uw stage. Stel dat da "Main.as" is. De document class is dan Main en de inhoud van Main.as is

Code:
package
{
      public class Main()
      {      
            public function Main() //constructor
            {
                  ...
            }
      }
}

In die constructor van uw Document class gaat ge nu bv andere objecten aanmaken, waarvan de ge de klassedinitie gewoon in een andere .as definieert. Alles in 1 .as file steken en globale variabelen definieren omdat gesharede data nodig is is volledig not-done. Parameters die geshared moeten zijn zult ge gewoon moeten doorgeven naar die objecten (bv bij constructie).

As ge eens googlet vindt ge al snel een hele hoop introducties over hoe goed OO te programmeren in AS3, omdat AS2 nog niet OO was en dus een hele hoop flash programmeurs die overgang hebben moeten maken.

Flipkikker

Legacy Member
Alright, thx :)

Had nog maar 1 inleiding gezien tot AS3, dus heb het niet voldoende bekeken...

Deze namiddag ga ik de classes nog es herbezien, maar eerst de volledige werking papier uitschrijven, zodatk niet opnieuw voor verrassingen kom te staan op het einde. :)

Flipkikker

Legacy Member
Vraagje, want ik vind het nogal verwarrend:

Kan/Mag een package meer dan één public class bevatten?

Bvb:

Package Data
met:
public class Survey
public class Results

Beide moeten onafhankelijk van elkaar toegankelijk zijn voor mij, want de Survey haalt zijn topics, vragen en antwoorden uit XML-bestand A en de class Results ontvangt alle resultaten van de eventdispatch die uit de collision detection het geselecteerde antwoord doorgeeft...
Class Results zal deze dan wegschrijven in XML-bestand B.

Indien dit niet mag, hoe moet ik het dan wel "correct" programmeren?

Flipkikker

Legacy Member
Architectuur v1.1

Herwerking op basis van bovenstaande comments, zou beter moeten zijn...
Enkel de bovenste (public) classes van ieder package communiceren via elkaar, geen globale variabelen ook meer.

De main functie roept de initialisatiefunctie op van de "spelwereld", deze maakt dan de benodigde objecten aan: Survey, Results, Key, Framebuffer.
Framebuffer doet bij ieder enterFrame:event een update van de coördinaten en roept na die berekeningen de draw functies aan.

Key zal een eventDispatch doen die gedefinieerd staat in Framebuffer onder Camera, waardoor het Camera-object dat aangemaakt is in de initialisatie van World de juiste beweging ondergaat.

Bij de initialisatie worden de objecten in deze volgorde aangemaakt:
Survey, Results, Framebuffer, Key
Hierdoor kan het Framebuffer object bij initialisatie de benodigde Survey en Results reference meekrijgen en kan het Key object de reference naar het gemaakte Camera object onder Framebuffer meekrijgen.

Simulation%20v1.1.jpg

Legende:
- Oranje pijl = doel extends vertrekpunt (vb Camera extends Vertex)
- internal classes worden gebruikt in bovenliggende public class, maar staan in de code uiteraard wel erbuiten gedeclareerd

edit: deadline dus niet gehaald spijtig genoeg...
De echte deadline ligt op volgende week maandag en het project loopt verder dan dat,
dus updates volgen nog...

Flipkikker

Legacy Member
Na de eerste test met proefpersonen zal ik toch een 3D engine moeten zoeken vrees ik. (of heel wat rekenwerk bij krijgen)

Ben nu een vereenvoudigd concept aan het maken waarbij de perspectiefberekeningen van cirkel>ellips geminimaliseerd worden,
door oa de horizonlijn exact in het midden te houden, geen rekening te houden met verticale beweging van het "oog" en de "camera".

Voor de eerste keer ook een drawingtest gedaan met Sprites in AS3, best wel makkelijke code eigenlijk :)
Heeft mij al wat inzicht bijgebracht voor het project.

Eerste simulatie zal gebruikt worden om te verifiëren of respondenten voldoende "gebruikservaring" voorgeschoteld krijgen als ze enkel hoofdbewegingen gebruiken om te antwoorden. We overwegen namelijk ook het gebruik van hand-/controls/gestures/touches/...

Vanavond zien hoe ver ik geraak.

Flipkikker

Legacy Member
Een gedeelte van de grafische module is werkende (als test)

Veel compiler errors moeten oplossen, allemaal te maken met private <> public en "float" dat em niet herkende als type (wtf?? > heb het vervangen door Number, maar dan nog?)

Flipkikker

Legacy Member
Preview

Testsim001.swf
Laatste update: 2010/03/16 - 4:46

Bediening met pijltjestoetsen links en rechts,
cameraperspectief is nu licht geroteerd om te tonen dat er effectief gerekend wordt om het perspectief te wijzigen.

Code (zipped)

Testsim001.zip


Indien gewenst kan ik ook de code hier in tags plaatsen, maar ik dacht dat makkelijker ging zijn om het geheel in je editor te kunnen lezen met syntax highlighting...

Zoals je ziet is het nog heel basic, kstel me ook vragen bij de keyboard bediening, zal die waarschijnlijk nog snel proberen om te bouwen naar bediening met de muis, zal de nagebootste headtracking hopelijk wat vloeiender/realistischer simuleren.

edit:

Vraag

In C++ kan je met pointers werken om de referentie naar een object als argument mee te geven,
zodat je de eigenschappen van het object via die externe functie rechtstreeks kunt wijzigen.

In AS3 moet je blijkbaar alle nodige functies voor die veranderingen in je object class definiëren.

Of mis ik iets?

Heb dit nu bvb ook gedaan voor de "draw-functie",
ieder keer als ik een object aanmaak van de TextShape class krijgt die zen eigen drawing functie.
Is er iets efficiënter of...?

Flipkikker

Legacy Member
Simulatie 1 = klaar

Heb bediening ingebouwd met de muis, zal dit zelf met men Wacom tablet bedienen en het gaat zá-lig vlot :D
Een pak betere ervaring dan de eerste test met toetsenbord.

Morgen zullen we enkele mensen laten ervaren wat het geeft.
Opdracht is om de groene vakjes te "pakken" (door er recht door te vliegen)

Bekijk het full-screen voor de beste ervaring, bij voorkeur bediening met een pen tablet.

Testsim001.swf

Code hiervan gooi ik later nog wel online, maar is uiterst rommelig en proceduraal geschreven. (ik had even genoeg van het werken met classes en alles hypercorrect doen)

edit:

Veel animo is er precies niet op dit subforum? =/
De test zelf ging toch niet zo vlot als gehoopt, dus dit weekend probeer ik er toch al face-tracking in te gooien, hiervoor heb ik een verbeterde versie van Marilena gedownload, een AS3-port van de C++ bib OpenCV naar Flash... :)

Flipkikker

Legacy Member
Gezocht: (kleine vergoeding)
AS3 programmeur die mij via msn/skype/irl (Antwerpen-centrum) die mij wat zaken van as3 packages en de scopes kan uitleggen (max 1h werk), want ik heb meer problemen met het importen en packagen dan met het schrijven van de code die alles verwerkt :doh:

Vergoeding &#8364; 10/h, via Paypal/... betaald (indien echt te laag, maar als student vraag ik ook maar &#8364;10/h in lessen V-Ray)
In natura kan ik ook lesgeven/begeleiden in de rest van de Adobe suite, webdesign (html,css,xml,xslt,php) of V-Ray rendering (in volgorde van niveau: Photoshop, Indesign, Lightroom, Illustrator, basics: After Effects, Premiere Pro)

Ben er net in geslaagd de Facetracking module in te laden en weer te geven, maar tis een enorme rommelboel aan het geraken en het werkt op men zenuwen :sop:

Update volgt, lesgevers/enthousiastelingen mogen zich via pm/hier aanbieden.


Edit:
Besturing met gezichtsherkenning zit erin, nog geen smoothing etc... Code is nog erger geworden en performance kan nog beter, maar bon... :)

http://realreality.be/Testsim002.swf

Flipkikker

Legacy Member
dacuba zei:
Ziet er cool uit, alleen snap ik totaal niets van uw uitleg (maar dat ligt aan mij). Kwam wel een beetje buggie over, maar dat kan ook aan mijn i-netverbinding liggen.

Ligt niet aan uw internetverbinding, want alle bewerkingen gebeuren op uw pc.
Het algoritme is gewoon nog niet geoptimaliseerd...


Test ging goed vandaag, hadden ook een fysieke vorm errond en er heel wa uit geleerd. :)

Flipkikker

Legacy Member
Ik ben nog steeds op zoek naar een "lesgever" (zie hierboven),
maar ben nu ook aan het twijfelen of ik wel met AS3 verder moet gaan...

Iemand die voldoende ervaring heeft en kan vertellen of C++ haalbaarder is?

Probleem met AS3 is de (schijnbaar?) beperkte performance, die we heel hard nodig hebben om realtime feedback te geven...
Hoe zit de ondersteuning bij C++ om graphics op het scherm te toveren zonder dat je er je beroep van moet maken?

Bestaan er grafische libraries die even makkelijk te importeren en gebruiken zijn als AS3 (en dan ook performanter zijn) ?
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan