Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Усечение пикселей в BitmapData (срочно) (http://www.flasher.ru/forum/showthread.php?t=202054)

AlexCooper 29.06.2013 13:31

Усечение пикселей в BitmapData (срочно)
 
Вложений: 1
Здравствуйте. Прошу помощи в решении задачи по усечению (заданию прозрачности серым и чёрным пикселям). Прилаживаю картинку, есть динамическай битмап дата, которая образ человека окрашивает в различный цвет кроме градаций серого, не нужны все серые, чёрные и белые пиксели. Каким образром можно битмапу очистить от них. Написал вот это
Код AS3:

public function byteArrayToBitmapData(bytes:ByteArray, _canvas:BitmapData, _viewport:BitmapData):void{
 
 
                        var calir:Boolean = false;
 
                        // прошло ли 5 секунд
                        if (new Date().time-_calibr<5000) {
                                calir = true;
                        }
 
                        _canvas.lock();
 
                        _viewport.lock();
                        _canvas.setPixels(new Rectangle(0,0, as3kinect.IMG_WIDTH, as3kinect.IMG_HEIGHT), bytes);
 
 
                        for ( var i=0;i<=as3kinect.IMG_WIDTH; i++) {
                                for ( var j=0;j<=as3kinect.IMG_HEIGHT; j++) {
 
                                        var pixel:uint = _canvas.getPixel(i,j);
 
                                        if (calir) {
                                                _test[pixel] = true;
                                                // если идет время калибровки заполняем массив полученніми пикселями
                                        } else {
 
                                                if (setmas) {
                                                        // если плотный массив пуст заполняем его уникальними цветами
                                                        for (var col:String in _test) {
                                                                _vect.push(uint(col));
 
                                                                // в результате примерно 50 пикселей
                                                                trace(col);
                                                        }
 
                                                        setmas = false;
 
                                                } else {
 
                                                        var nodep:Boolean = true;
 
                                                        // ищем пиксель в калибровочном массиве
                                                        for each( var color_id:uint in _vect)
                                                        {
                                                                if (color_id==pixel) nodep = true;
                                                        }
 
                                                        if (nodep) {
                                                                _viewport.setPixel32(i,j,0xFFFFFF00);
                                                        } else {
                                                                _viewport.setPixel32(i,j,0xFF0000);
                                                        }
 
                                                }
 
                                        }/**/
 
                                }
                        }
 
                        _viewport.unlock();
                        _canvas.unlock();
 
                }

суть в том что на протяжении первых пяти секунд перебираеться попиксельно получаемая картинка и записуються полученные цвета в массив (первые пять секунд нужно быть не в кадре), потом они заполняют вектор и каждую итерацию сравнивается цвет пикселя в масиве, если на сцене появился человек его перекрашивает в красный и при проходе цикла при сравнии с полученным калибровочном массиве идет перерисовка. Но при такой схеме как только добавляешь цикл проверки на градацию серого флешка начинает жудко глючить. Подскажите как еще можно обесцветить серые чёрные и белые пиксели в альфу 0

Tails 29.06.2013 13:38

PixelBender
На PB такую программу обработки очень просто сделать. Пишете код в PixelBender, экспортируете во флеш, подключаете как фильтр к битмапе или битмап дате.

AlexCooper 29.06.2013 13:47

Цитата:

Сообщение от Tails (Сообщение 1139646)
PixelBender
На PB такую программу обработки очень просто сделать. Пишете код в PixelBender, экспортируете во флеш, подключаете как фильтр к битмапе или битмап дате.

посоветуйте мануал максимально подходящий для такого рода задачи

Tails 29.06.2013 13:49

http://habrahabr.ru/post/70246/
http://habrahabr.ru/post/84396/
http://help.adobe.com/ru_RU/as3/dev/...950BBC223.html

Твоя задача вообщем то - изучить работу с PB, научиться внедрять созданный фильтр во флешь. 1 может 2 дня мозгового штурма, и ты станешь на 20% круче. Такая обработка битмапы идеально подходит для учебных целей.

Алгоритм пиксельного шейдера не сложный - получаешь цвет пикселя и на основе каких-то переданных констант решаеш - рисовать его или нет.

AlexCooper 29.06.2013 13:56

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

Добавлено через 10 минут
я уже впринцепи разобрался что и как. Внедрил без проблем фильтр. Осталось вычитание пикселей. Большое спасибо, действительно мощный инструмент)

Tails 29.06.2013 14:08

PB фильтры разрабатываются в бесплатной программе Pixel Bender, от-туда же экспортируются в формате .pbj для внедрения во флешь.
Сперва скачайте Pixel Bender. В ней есть разные примеры готовых фильтров. И почитайте статьи по ссылкам, саму документацию на сайте адоби на русском.

Получение цвета пикселя производиться как выборка из текстуры на основе текущих координат:
Код:

dst = sampleNearest(src, outCoord());
dst - цвет пикселя:
dst.r - значение красного (0-1)
dst.g - значение зелёного (0-1)
dst.b - значение синего (0-1)
dst.a - прозрачность (0-1)

outCoord() - функция для получения x,y координат текущего пикселя.
src - битмапа из которой производится выборка

AlexCooper 29.06.2013 14:11

нашел как перекрашивать, осталось получить значение цвета пикселя

Добавлено через 1 минуту
Цитата:

Сообщение от Tails (Сообщение 1139651)
PB фильтры разрабатываются в бесплатной программе Pixel Bender, от-туда же экспортируются в формате .pbj для внедрения во флешь.
Сперва скачайте Pixel Bender. В ней есть разные примеры готовых фильтров. И почитайте статьи по ссылкам, саму документацию на сайте адоби на русском.

Получение цвета пикселя производиться как выборка из текстуры на основе текущих координат:
Код:

dst = sampleNearest(src, outCoord());
dst - цвет пикселя:
dst.r - значение красного (0-1)
dst.g - значение зелёного (0-1)
dst.b - значение синего (0-1)
dst.a - прозрачность (0-1)

outCoord() - функция для получения x,y координат текущего пикселя.
src - битмапа из которой производится выборка

спасибо большое) Я уже скачал, экспортировал и подтянул фильтр. Все работает идеально, вычитаю пиксели, остался только механизм определения градации серого.

Tails 29.06.2013 14:20

Найди среднее арифметическое трёх цветовых каналов, если интенсивность красного канала отличается от среднего значения более некоторого порога - рисуешь пиксель, иначе - альфа канал в прозрачность.

AlexCooper 29.06.2013 14:24

Вложений: 1
сделал так, но еще нужно корректировки. Дело в том что там не только крассный, там еще 4-5 цветов, синий, зелённый, желтый. Не могу додумать как опередилить серый это или нет.

AlexCooper 29.06.2013 14:29

блин, читать нужно внимательней))
Цитата:

Найди среднее арифметическое трёх цветовых каналов, если интенсивность красного канала отличается от среднего значения более некоторого порога - рисуешь пиксель, иначе - альфа канал в прозрачность.
еще раз спасибо))


Часовой пояс GMT +4, время: 01:30.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.