2010-06-03 2 views
0

Я работаю в игре.AS3: Как эффективно получить доступ к данным пикселя?

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

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

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

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

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

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

ответ

2

Назовем пиксели, объекты которых направлены в направлении «аттракторов», потому что они привлекают объекты.

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

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

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

0

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

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

+0

Извините, но это неправильно. Количество итераций одинаково в обоих случаях, если то, что вы пытаетесь сделать, это оценить * каждый * пиксель. Являются ли петли вложенными или нет, это не изменяет этот факт. Помещение пикселов в ByteArray не принесет вам ничего в этом сценарии. На самом деле это хуже: вы будете использовать (по крайней мере) вдвое больше памяти; вы избежите вызова getPixel(), но в конечном итоге вы вызове readUnsignedInt() столько же раз; если вам нужно знать пиксельные шнуры (вполне вероятно), вы в конечном итоге добавите счетчики для x и y или с помощью модуля. Во всяком случае, здесь нет никакой выгоды. –

+1

Использование getPixels(), безусловно, предпочтительнее getPixel(). Накладные расходы любого вызова метода во Flash огромны, и поскольку вы можете получить доступ к ByteArray, например массиву, например myPixels [index], вы сэкономите накладные расходы на вызов метода для каждого пикселя. Кроме того, флеш внутренне выполняет проверку границ для getPixel(), что является еще одним замедлением. – Quasimondo

+0

@Quasimondo. Вы более осведомлены, чем меня относительно манипуляции с картинками (я следую вашему блогу!). Тем не менее, я не уверен, что getPixels лучше, чем getPixels в данных обстоятельствах (т. Е. Если вы хотите что-то делать с каждым пикселем). Вызов функции, безусловно, накладные расходы, но IIRC, Nicolas Canasse продемонстрировал, что доступ к массиву также довольно медленный (не уверен, что это изменилось у самых новых игроков). –

0

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