0 votes

AS3 : Comment accéder efficacement aux données des pixels ?

Je travaille sur un jeu.

Le jeu demande aux entités d'analyser une image et de se diriger vers des pixels ayant des propriétés spécifiques (canal rouge élevé, etc.).

J'ai regardé dans Pixel Bender, mais cela ne semble utile que pour écrire de nouvelles couleurs dans l'image. Pour l'instant, même à basse résolution (200x200), une seule entité scannant l'image ralentit à 1-2 images/seconde.

J'incorpore l'image et l'instance en tant que Bitmap comme enfant de la scène. La situation 1-2 FPS utilise BitmapData.getPixel() (sur chaque pixel) avec un calcul de distance au préalable.

Je me demande s'il y a un moyen de le faire plus efficacement... J'ai d'abord pensé à une sorte de partitionnement spatial couplé à une division de l'image en plusieurs petits morceaux.

Je pense aussi que Pixel Bender devrait pouvoir aider d'une manière ou d'une autre, mais j'ai peu d'expérience avec lui.

Merci pour toute aide. Jonathan

2voto

Heath Hunnicutt Points 9801

Appelons les pixels vers lesquels les entités se dirigent "attracteurs" car ils attirent les entités.

Vous décrivez une faible fréquence d'images due à la recherche d'attracteurs. Cela indique que vous pouvez éventuellement scanner une image à chaque image. Vous ne précisez pas si l'image balayée est statique ou change aussi fréquemment que, par exemple, une entrée vidéo. Si l'image change à chaque trame, de sorte que vous devez recalculer les attracteurs d'une manière ou d'une autre, alors ce que vous essayez de faire est la vision par ordinateur en temps réel avec la machine virtuelle ABC, voir ci-dessous.

Si vous avez une image immuable, l'optimisation la plus importante que vous pouvez faire est de scanner l'image une seule fois, puis de sauvegarder un résumé (ou "mémorisation") des emplacements des attracteurs. À chaque trame de rendu, plutôt que de scanner l'image entière, vous pouvez rechercher la liste ou le tableau des attracteurs connus. Lorsque l'utilisateur modifie l'image, vous pouvez recalculer à partir de zéro ou mettre à jour vos calculs de manière incrémentielle, comme bon vous semble.

Si vous essayez de faire de la vision par ordinateur en temps réel avec ActionScript 3, je vous suggère de jeter un coup d'œil à la nouvelle version du logiciel vector de Flash 10.1 et aussi que vous envisagez d'utiliser soit abcsx pour écrire le code assembleur ABC, ou utiliser L'alchimie d'Adobe pour compiler le C sur le runtime Flash. ABC est le code d'octet de Flash. En d'autres termes, reconsidérez l'utilisation de AS3 pour la vision par ordinateur en temps réel.

0voto

Wallacoloo Points 2957

BitmapData a un getPixels (remarquez qu'il s'agit d'un pluriel). Elle retourne un tableau d'octets de tous les pixels. qui peut être itéré beaucoup plus rapidement qu'une boucle for avec un appel à getPixel à l'intérieur, imbriqué dans une autre boucle for . Malheureusement, les tableaux d'octets sont, comme leur nom l'indique, des tableaux d'octets unidimensionnels, de sorte que l'itération de chaque pixel (4 octets) nécessite l'utilisation d'une boucle for, et non d'une boucle foreach. Par défaut, vous pouvez accéder au canal de couleur de chaque pixel individuellement, mais cela ressemble à ce que vous voulez (trouver les pixels avec un "canal rouge élevé"), donc vous n'aurez pas à faire une itération bit à bit de chaque valeur de pixel pour isoler un canal particulier.

J'ai lu quelque part que getPixel est très lent, donc c'est là que je pensais que vous économiseriez le plus. Je peux me tromper, donc ça vaudrait le coup de chronométrer.

0voto

dotminic Points 770

Je dirais que la réponse de Heath Hunnicutt est bonne. Si l'image ne change pas, il suffit de stocker toutes les valeurs de couleur dans un vecteur ou un byteArray de n'importe quel type et de l'utiliser comme une table de consultation pour ne pas avoir à appeler getPixel() à chaque image.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X