-
09-03-2010, 21:16 #1Member
- Registered
- 05/06/04
- Location
- Antwerpen
- Posts
- 5,700
- iTrader
- 3 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 4/23
[AS3/C++/OpenCV] Project: Simulatie met Face Tracking
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
Last edited by Flipkikker; 04-04-2010 at 01:35.
=)no votes
-
-
09-03-2010, 21:22 #2Member
- Registered
- 05/06/04
- Location
- Antwerpen
- Posts
- 5,700
- iTrader
- 3 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 4/23
Documentatie:
- FullOpenCVWiki - OpenCV Wiki
- Object-oriented programming with ActionScript 3.0 | Adobe Developer Connection
- Move Objects with Keys in Adobe Flash
- Flash Quick Starts: Animating with ActionScript in Flash
- Tutorial 1 - Points in Space
- Tutorial 2: Polygons
- Tutorial 3: Camera Movement
Laatste update: 2010/03/09 - 20:22=)no votes
-
09-03-2010, 22:05 #3Member
- Registered
- 05/06/04
- Location
- Antwerpen
- Posts
- 5,700
- iTrader
- 3 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 4/23
Ben even de classes aan het uitschrijven,
daarbij iets "verwarrend" tegengekomen:
de new operator
Moet je deze verplicht gebruiken?
Bvb:
Bijkomend vraagje:Code:private var question:String; // Correct? private var question:String = new String(); // Beter? Wat is het verschil?
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?
OFCode:public function MCQuestion (q:String, a:Array):void { question = q; answers = a; }
Code:public function MCQuestion ():void { if(arguments.length > 2) { question = arguments.shift(); for each(var s:String in arguments) { answers.push(s); } } }Last edited by Flipkikker; 09-03-2010 at 22:26.
=)no votes
-
09-03-2010, 22:22 #4
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++.no votes
-
09-03-2010, 22:27 #5Member
- Registered
- 05/06/04
- Location
- Antwerpen
- Posts
- 5,700
- iTrader
- 3 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 4/23
no votes
-
09-03-2010, 23:10 #6Member
- Registered
- 05/06/04
- Location
- Antwerpen
- Posts
- 5,700
- iTrader
- 3 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 4/23
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...

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
Last edited by Flipkikker; 10-03-2010 at 04:12.
=)no votes
-
10-03-2010, 01:33 #7Member
- Registered
- 05/06/04
- Location
- Antwerpen
- Posts
- 5,700
- iTrader
- 3 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 4/23
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...=)no votes
-
10-03-2010, 04:05 #8Member
- Registered
- 05/06/04
- Location
- Antwerpen
- Posts
- 5,700
- iTrader
- 3 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 4/23
Tussenstand 1: ruwe structuur geprogrammeerd
Moet vooral de laatste classes nog eens goed herbezien en corrigeren, want die had ik nog niet zo doordacht (en dat merk je).PHP Code:/*********
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
}
*/
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...Last edited by Flipkikker; 13-01-2014 at 20:04.
=)no votes
-
10-03-2010, 11:05 #9Member
- Registered
- 18/07/03
- Location
- Limburg
- Posts
- 3,733
- iTrader
- 27 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 2/13
Oei, alles in 1 AS3 file.

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
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).Code:package { public class Main() { public function Main() //constructor { ... } } }
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.no votes
-
10-03-2010, 13:35 #10Member
- Registered
- 05/06/04
- Location
- Antwerpen
- Posts
- 5,700
- iTrader
- 3 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 4/23
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.
=)no votes
-
10-03-2010, 18:53 #11Member
- Registered
- 05/06/04
- Location
- Antwerpen
- Posts
- 5,700
- iTrader
- 3 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 4/23
Documentatie:
- FullOpenCVWiki - OpenCV Wiki
- Object-oriented programming with ActionScript 3.0 | Adobe Developer Connection
- Move Objects with Keys in Adobe Flash
- Flash Quick Starts: Animating with ActionScript in Flash
- Tutorial 1 - Points in Space
- Tutorial 2: Polygons
- Tutorial 3: Camera Movement
Laatste update: 2010/03/09 - 20:22
- http://livedocs.adobe.com/flash/9.0/...=00000041.html
- kirupaForum - View Single Post - ActionScript 3 Tip of the Day
- Introduction to event handling in ActionScript 3.0 | Adobe Developer Connection
- Adobe ActionScript 3.0 * Basics of handling events
Laatste update: 2010/03/10 - 17:53Last edited by Flipkikker; 10-03-2010 at 19:03.
=)no votes
-
10-03-2010, 19:08 #12Member
- Registered
- 05/06/04
- Location
- Antwerpen
- Posts
- 5,700
- iTrader
- 3 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 4/23
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?=)no votes
-
10-03-2010, 19:44 #13Member
- Registered
- 05/06/04
- Location
- Antwerpen
- Posts
- 5,700
- iTrader
- 3 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 4/23
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.

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...Last edited by Flipkikker; 11-03-2010 at 01:10.
=)no votes
-
13-03-2010, 23:25 #14Member
- Registered
- 05/06/04
- Location
- Antwerpen
- Posts
- 5,700
- iTrader
- 3 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 4/23
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.=)no votes
-
14-03-2010, 03:29 #15Member
- Registered
- 05/06/04
- Location
- Antwerpen
- Posts
- 5,700
- iTrader
- 3 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 4/23
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?)=)no votes

