8
votes

FPS bas lorsque vous accédez au tampon d'image de sortie vidéo iPhone

J'essaie de faire un traitement de l'image sur iPhone. J'utilise http://developer.apple.com/library/ iOS / # qa / qa2010 / qa1702.html pour capturer les cadres de la caméra.

Mon problème est que lorsque j'essaie d'accéder au tampon capturé, la caméra FPS tombe de 30 à environ 20. Est-ce que quelqu'un sait comment je peux le réparer?

J'utilise la qualité de capture la plus basse que je pouvais trouver (avCapturesSessionPresetlow = 192x144) dans le format KCVPIXEFORFORCATTYPE_32BGRA. Si quelqu'un sait une qualité inférieure, je pourrais utiliser, je suis prêt à l'essayer.

Lorsque je fais la même image accédant à d'autres plates-formes, comme Symbian, cela fonctionne bien.

Voici mon code: xxx

comme suivi aux réponses, j'ai besoin de traiter l'image en temps réel, il est affiché.

J'ai remarqué que lorsque j'utilise AVCapturesSessionPresethigh, la chose la plus simple que je fais, comme: xxx

provoque la chute du framerate à 4-5 FPS. Je suppose que c'est parce qu'une image de cette taille n'est pas mise en cache.

essentiellement, j'ai besoin d'une image 96x48. Existe-t-il un moyen simple de réduire l'image de sortie de la caméra, une manière qui utilise une accélération matérielle, afin que je puisse travailler avec le petit?


0 commentaires

3 Réponses :


1
votes

Disclaimer: Cette réponse est une supposition :)

Vous faites beaucoup de travail pendant que le tampon est verrouillé; Est-ce de maintenir le fil qui capture l'image de la caméra?

Vous pouvez copier les données hors du tampon pendant que vous y travaillez afin de pouvoir le déverrouiller dès que quelque chose comme xxx

Si c'est le verrou qui tient la capture, cela devrait aider.

NB Vous pouvez accélérer cela si vous savez que tous les tampons seront de la même taille que vous peut simplement appeler MALLOC une fois pour obtenir la mémoire, puis simplement la réutiliser à chaque fois et ne le libérez que lorsque vous avez fini de traiter tous les tampons.


ou si ce n'est pas le problème que vous pourriez essayer d'abaisser la baisse du Priorité de ce fil xxx


3 commentaires

Je conviens que la transformation lente est probablement lente qui traîne toute la capture, mais je ne suis pas sûr que simplement libérer la serrure tôt fera beaucoup pour aider. Afin de traiter des cadres à 30 fps, le rappel de chaque cadre devra terminer en moins de 1/30 d'une seconde. Si ce n'est pas le cas, les opérations de traitement vont simplement parcourir le fil sur lequel ils fonctionnent.


Non si cela fonctionnait comme producteur-> Modèle de consommation - les rappels seraient juste en file d'attente - tout dépend de ce qu'il fait avec l'image modifiée. Si c'est juste le sauver, alors hé, laissez-le sauvegarder dans un tampon quelque part. Si c'est affiché, il a un problème :)


J'ai essayé le memcpy sur un tampon dédié, mais cela n'a pas aidé du tout, il était en fait plus lent :(



8
votes

Tout ce qui compte sur chaque pixel d'une image sera assez lent sur tous les appareils iOS les plus rapides. Par exemple, j'ai été comparé itération sur chaque pixel dans un cadre vidéo 640 x 480 (307 200 pixels) avec un simple test de couleur per-pixel et constaté que cela ne fonctionne que sur environ 4 FPS sur un iPhone 4.

Vous envisagez de traiter 27 648 pixels dans votre cas, qui devrait courir assez vite pour atteindre 30 FPS sur un iPhone 4, mais c'est un processeur beaucoup plus rapide que ce qui était dans l'iPhone et iPhone 3G d'origine. L'iPhone 3G va probablement toujours lutter avec cette charge de traitement. Vous ne dites pas non plus à quel point le processeur était rapide dans vos appareils Symbian.

Je suggérerais de retravailler votre algorithme de traitement pour éviter la conversion de l'espace de courant. Il ne devrait pas y avoir besoin de réorganiser les composants de couleur afin de les traiter.

En outre, vous pouvez traiter sélectivement quelques pixels par échantillonnage à certains intervalles dans les lignes et les colonnes de l'image.

Enfin, si vous ciblez les nouveaux périphériques ios qui prennent en charge OpenGL ES 2.0 (iPhone 3G S et Newer), vous pouvez envisager d'utiliser un Shader GLSL Fragment pour traiter entièrement le cadre vidéo sur le GPU. Je décris le processus ici , avec le code d'échantillon pour le suivi des objets en temps réel. Le GPU peut gérer ce type de traitement 14 - 28 fois plus rapide que le processeur, dans mes repères.


0 commentaires

0
votes

Copiez le contenu du cadre de la caméra dans un tampon dédié et de l'utiliser à partir de là. Cela se traduit par une amélioration massive de la vitesse de mon expérience. Ma meilleure hypothèse est que la région de la mémoire où se trouve le cadre de la caméra contient des protections spéciales qui font des accès à la lecture / écriture lent.

Consultez l'adresse de la mémoire des données du cadre de la caméra. Sur mon appareil, le tampon de la caméra est à 0x63ac000 . Cela ne signifie rien pour moi, sauf que les autres objets de tas sont en adresses plus proches de 0x1300000 . La suggestion de verrouillage n'a pas résolu mon ralentissement, mais le memcpy a fait.


1 commentaires

Je n'ai pas vu cette amélioration de l'accélération. Dans mon cas, les choses memcpy ralentissent légèrement, en raison des frais généraux de la copie elle-même. Aucune suggestion?