Maar de berekening is nog steeds veel te langzaam, dus ik moet een andere vinden
methode om de quallantie van de inputvideostream te verminderen.
Het echte antwoord op deze vraag ligt veel dichter bij "er is niet veel dat je kunt doen!" dan naar iets anders. We moeten erkennen dat mobiele telefoons nog geen krachtige verwerkingscapaciteiten hebben zoals elke desktop. De meeste Android-telefoons ter wereld gebruiken nog steeds eerdere versies van het systeem en het allerbelangrijkste: het zijn single-core apparaten, ze worden geklokt met snelheden lager dan 1 GHz, ze hebben een beperkt geheugen, bla bla ...
Toch is er altijd iets dat u kunt doen om de snelheid te verbeteren met kleine veranderingen in de prestaties.
Nu ben ik ook bezig met het berekenen van OpenCV SURF op de GalaxyS en ik heb een framesnelheid van 1,5 fps voor 200 functies met een hessische drempelwaarde van 1500 in een 320x240-afbeelding. Ik geef toe dat het waardeloze prestaties zijn, maar in mijn geval hoef ik alleen maar af en toe functies te berekenen, omdat ik de optische flow meet voor trackingdoeleinden. Het is echter heel raar dat je maar om de 4-5 seconden maar 1 frame kunt krijgen.
1) Ten eerste lijkt het mij dat u VideoCapture gebruikt om de cameraframes te verkrijgen. Nou, dat ben ik niet. Ik gebruik de Android-camera-implementatie. Ik heb niet gecontroleerd hoe VideoCapture is geïmplementeerd in de Java-poort van OpenCV, maar het lijkt trager te zijn dan de implementatie in sommige handleidingen te gebruiken. Ik kan hier echter niet 100% zeker van zijn, omdat ik het niet heb getest. Heb jij?
2) Verlaag native calls naar het minimaal mogelijke. Java OpenCV native calls zijn tijdrovend. Volg ook alle richtlijnen op de Android-OpenCV best practices-pagina . Als u meerdere native calls hebt, voegt u ze allemaal bij elkaar in één JNI-aanroep.
3) U moet ook de afbeeldingsgrootte verkleinen en de drempelwaarde voor SURF Hessiaan verhogen. Dit zal echter het aantal gedetecteerde functies verminderen, maar ze zullen sterker en robuuster zijn met het oog op herkenning en matching. Je hebt gelijk als je zegt dat de SURF de robuustere detector is (hij is ook de langzaamste, en hij is gepatenteerd). Maar als dit geen doodslot voor u is, zou ik aanraden om de nieuwe ORB-detector te gebruiken, een variant van KORTE die beter presteert op het gebied van rotatie. ORB heeft echter nadelen, zoals het beperkte aantal gedetecteerde keypoints en slechte schaalinvariantie. Dit is een zeer interessant vergelijkingsrapport voor functiedetectoralgoritmen. Het suggereert ook dat de SURF-detector trager is in de nieuwe OpenCV 2.3.1-versie, waarschijnlijk als gevolg van enkele wijzigingen in het algoritme, voor meer robuustheid.
4) Now the fun bits. The ARM processor architecture (in which most of the Android phones are based) has been widely reported for its slowness handling floating point calculations, in which feature detector algorithms rely heavily. There have been very interesting discussions about this issue, and many say you should use fixed-point calculations whenever possible. The new armv7-neon architecture provides faster floating point calculations, but not all devices support it. To check if your device does support it, run adb shell cat proc/cpuinfo
. You can also compile your native code with NEON directives (LOCAL_ARM_NEON := true
) but I doubt this will do any good, since apparently few OpenCV routines are NEON optimized. So, the only way to increase speed with this, is to rebuild the code with NEON intrinsics (this is completely unexplored ground for me, but you might find it worth looking). In the android.opencv group it was suggested that future OpenCV releases will have more NEON-optimized libraries. This could be interesting, however I am not sure if it is worth working on it or wait for faster CPUs and optimized systems using GPU computing. Note that Android systems < 3.0 do not use built-in hardware acceleration.
5) Als je dit voor academische doeleinden doet, overtuig dan je universiteit om een beter apparaat voor je te kopen ^^. Dit zou uiteindelijk de beste optie kunnen zijn voor snellere detectie van SURF-functies. Een andere optie is om de algoritmen te herschrijven. Ik ben me ervan bewust dat sommige jongens in de Intel-labs het hebben gedaan, met enig succes, maar ze zullen het duidelijk niet delen.
Eerlijk gezegd, nadat ik dit probleem enkele weken had onderzocht, besefte ik dat voor mijn specifieke behoeften (en aangezien ik geen computerwetenschappelijk ingenieur ben, noch een algoritmen-expert) er meer waarde is om een paar maanden te wachten op betere apparaten dan met mijn hoofd te bonzen op de muur die de algoritmes ontleedt en bijna-assemblagecode ontwikkelt.
Met vriendelijke groeten en veel geluk!