Page 1 of 2 12 Last
  1. #1
    Flipkikker's Avatar
    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  

  2. #2
    no votes  

  3. #3
    Flipkikker's Avatar
    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:
    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);
            }
        }
    }
    Last edited by Flipkikker; 09-03-2010 at 22:26.
    =)
    no votes  

  4. #4
    kwitters's Avatar
    Registered
    14/10/04
    Posts
    162
    iTrader
    0
    Mentioned
    0 Post(s)
    Quote Originally Posted by Flipkikker View Post
    This quote is hidden because you are ignoring this member. Show
    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++.
    no votes  

  5. #5
    Flipkikker's Avatar
    Registered
    05/06/04
    Location
    Antwerpen
    Posts
    5,700
    iTrader
    3 (100%)
    Mentioned
    0 Post(s)
    Reputation
    4/23
    Quote Originally Posted by kwitters View Post
    This quote is hidden because you are ignoring this member. Show
    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
    =)
    no votes  

  6. #6
    Flipkikker's Avatar
    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  

  7. #7
    Flipkikker's Avatar
    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  

  8. #8
    Flipkikker's Avatar
    Registered
    05/06/04
    Location
    Antwerpen
    Posts
    5,700
    iTrader
    3 (100%)
    Mentioned
    0 Post(s)
    Reputation
    4/23
    Tussenstand 1: ruwe structuur geprogrammeerd


    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:Stringa: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 0yy:float 0zz: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 0yy:float 0zz:float 0rroll:float 0ppitch:float 0yyaw: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:uintttext:Stringsshape: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_vanswers.lengthi++)
            {
                
    _vanswers[i].calcCCoordinates(ccamera);
            }
        }
        
        
    // constructor
        
    public function VTopic(rreference:uintsquestion:Stringsanswers:Array):void
        
    {
            
    _reference rreference;
            
    _vquestion = new TextShape(rreferencesquestion"Rectangle");
            for (
    int i 0sanswers.lengthi++)
            {
                
    _vanswers[i] = new TextShape(isanswers[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...
    Last edited by Flipkikker; 13-01-2014 at 20:04.
    =)
    no votes  

  9. #9
    MAXXUR's Avatar
    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

    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.
    no votes  

  10. #10
    Flipkikker's Avatar
    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  

  11. #11
    no votes  

  12. #12
    Flipkikker's Avatar
    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  

  13. #13
    Flipkikker's Avatar
    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  

  14. #14
    Flipkikker's Avatar
    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  

  15. #15
    Flipkikker's Avatar
    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  

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  

Log in

Log in