Frame
retourné par FrameGrabber.grab()
est javacv spécifique, Bitmap
est Android spécifique, je doute qu'il y ait une méthode de convertion plus rapide entre les deux parce qu'ils ne savent pas et les deux étant optimisés pour leur propre usage, ils ne peuvent pas optimiser un processus de conversion entre les deux formats de données.
Vous déménagez 1280 * 720 * 4 octets, environ 3,6 Mo par image, il est beaucoup plus pour les appareils mobiles, surtout compte tenu de l'allocation de mémoire.
Je doute que vous trouverez un autre outil de conversion sans échanger javacv pour quelque chose d'autre - vous ne pouvez pas imaginer un outil spécialement conçu pour convertir Frame
de javacv en Android Bitmap
pour remplacer les méthodes intégrées.
En outre, AndroidFrameConverter.convert()
est déjà assez intelligent - il crée le Bitmap
seulement pour la première fois ou si la spécification a changé (comme la taille, etc.), alors il suffit de copier les octets.
Alors heureusement, il a la possibilité de réutiliser une fois créé Bitmap
par exemple, FFmpegFrameGrabber
a aussi cette capacité, si le premier terme, ils vont créer chacun un objet approprié, mais à partir du deuxième cadre sur devraient réutiliser les objets qu'ils ont - de cette façon au moins, aucune allocation de mémoire inutile ne se produira, ce qui tue les performances sur les appareils mobiles. Cela signifie que la conversion de nombreux cadres en moyenne devrait être beaucoup plus rapide que la conversion seule image - il suffit de ne pas créer de nouvelles instances de la carte d'acquisition et d'un convertisseur pour chaque trame.
La parallélisation à l'aide de GPU est peut-être possible - créez un Bitmap
manuellement, partitionnez le tampon Frame
et définissez les pixels du Bitmap
en parallèle. Je n'ai jamais fait quelque chose comme ça, donc je ne peux pas vraiment en dire plus. Gardez juste à l'esprit que les algorithmes parallèles ont leur propre surcharge et ne sont pas toujours plus rapides que les algorithmes séquentiels. Et je ne suis pas sûr de savoir comment la programmation GPU portable est. La mise en parallèle à l'aide du processeur ne vaut pas la peine d'être essayée - combien de cœurs ont des périphériques actuels? 4? Les frais généraux devraient être plus que le gain.
La conversion de bitmap est une tâche lourde. Il faudra donc du temps pour la convertir. La chose est quelle opération devez-vous faire après la conversion en bitmap? –
Je veux dessiner quelques superpositions sur bitmap après la conversion. –
puis son bon.Javacv fournit cette fonctionnalité via FrameFilter dans lequel vous pouvez utiliser la commande ffmpeg pour dessiner une superposition sans convertir en bitmap.J'ajouter un exemple de code pour FrameFilter, puis vous pouvez jouer avec cela pour atteindre le résultat souhaité. –