AS3: Как получить доступ к пиксельным данным? - PullRequest
0 голосов
/ 03 июня 2010

Я работаю над игрой.

Игра требует, чтобы объекты анализировали изображение и двигались к пикселям с определенными свойствами (высокий красный канал и т. Д.)

Я посмотрел в Pixel Bender, но это кажется полезным только для записи новых цветов на изображение. В настоящий момент, даже при низком разрешении (200x200) только один объект, сканирующий изображение, замедляется до 1-2 кадров в секунду.

Я встраиваю изображение и копирую его в качестве растрового изображения как ребенка сцены. Ситуация 1-2 FPS использует BitmapData.getPixel () (для каждого пикселя) с предварительным вычислением расстояния.

Мне интересно, есть ли какой-нибудь способ, которым я могу сделать это более эффективно ... Моей первой мыслью было какое-то пространственное разделение в сочетании с разбиением изображения на множество более мелких частей.

Мне также кажется, что Pixel Bender должен как-то помочь, однако у меня с этим мало опыта.

Приветствия за любую помощь. Джонатан

Ответы [ 3 ]

2 голосов
/ 03 июня 2010

Давайте назовем пиксели, которые сущности направляют к «аттракторам», потому что они притягивают сущности.

Вы описываете низкую частоту кадров из-за сканирования на аттракторы. Это указывает на то, что вы можете сканировать изображение в каждом кадре. Вы не указываете, является ли отсканированное изображение статичным или изменяется так часто, как, например, видеовход. Если изображение меняется с каждым кадром, и вам необходимо как-то пересчитать аттракторы, то вы пытаетесь найти компьютерное зрение в реальном времени с помощью виртуальной машины ABC, см. Ниже.

Если у вас есть неизменяемое изображение, то самая важная оптимизация, которую вы можете сделать, - это сканировать изображение только один раз, а затем сохранить сводку (или «памятку») местоположений аттракторов. В каждом кадре рендеринга вместо сканирования всего изображения можно выполнять поиск в списке или массиве известных аттракторов. Когда пользователь заставляет изображение измениться, вы можете пересчитать его с нуля или постепенно обновлять свои вычисления - по своему усмотрению.

Если вы пытаетесь использовать компьютерное зрение в реальном времени с помощью ActionScript 3, я предлагаю вам взглянуть на новые vector типы Flash 10.1, а также на использование abcsx для написания ABC. ассемблерный код или используйте Алхимия Adobe для компиляции C во время выполнения Flash. ABC - это байт-код Flash. Другими словами, пересмотреть использование AS3 для компьютерного зрения в реальном времени.

0 голосов
/ 15 июля 2010

Я бы сказал, что ответ Хита Ханникута - хороший. Если изображение не меняется, просто сохраните все значения цвета в векторе. или byteArray и т. д. и используйте его как справочную таблицу, чтобы вам не нужно было вызывать getPixel () каждый кадр.

0 голосов
/ 03 июня 2010

BitmapData имеет метод getPixels (обратите внимание, что это множественное число). Он возвращает байтовый массив всех пикселей , который может повторяться намного быстрее, чем цикл for с вызовом getPixel внутри, вложенным внутрь другого цикла for . К сожалению, байтовые массивы, как следует из их названия, являются одномерными массивами байтов, поэтому для итерации каждого пикселя (4 байта) необходимо использовать цикл for, а не цикл foreach. По умолчанию вы можете получить доступ к цветному каналу каждого пикселя по отдельности, но это звучит так, как вы хотите (найдите пиксели с «высоким красным каналом»), поэтому вам не придется поразрядно - и значение каждого пикселя выделять конкретный канал.

Я где-то читал, что getPixel работает очень медленно, поэтому я решил, что вы сэкономите больше всего. Я могу ошибаться, поэтому стоило бы рассчитать время.

...