![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Apr 2012
Сообщений: 26
|
Все, я понял. Буду пользовать getPixels и setPixels)
Добавлено через 24 минуты package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.BlendMode; import flash.display.Sprite; import flash.events.Event; import flash.events.NetStatusEvent; import flash.events.SecurityErrorEvent; import flash.geom.ColorTransform; import flash.geom.Matrix; import flash.geom.Rectangle; import flash.media.Video; import flash.net.NetConnection; import flash.net.NetStream; import flash.utils.ByteArray; public class Testvideo extends Sprite { private var videoURL:String = 'Deeper112.flv'; private var connection:NetConnection; private var stream:NetStream; private var video:Video = new Video(); public var bm:Bitmap; public function Testvideo() { connection = new NetConnection(); connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); connection.connect(null); } private function netStatusHandler(event:NetStatusEvent):void { switch (event.info.code) { case "NetConnection.Connect.Success": connectStream(); break; case "NetStream.Play.StreamNotFound": trace("Stream not found: " + videoURL); break; } } private function securityErrorHandler(event:SecurityErrorEvent):void { trace("securityErrorHandler: " + event); } private function connectStream():void { var stream:NetStream = new NetStream(connection); stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); video.attachNetStream(stream); stream.play(videoURL); addChild(video); bm = new Bitmap(); addChild(bm); bm.x = video.width+10; addEventListener(Event.ENTER_FRAME,onEnterHandler); } public function onEnterHandler(e:Event):void { var bmd:BitmapData = new BitmapData(video.width,video.height); var bmd2:BitmapData = new BitmapData(video.width,video.height); //var mtx:Matrix = new Matrix(0,0,0,0,0,0); //var ct:ColorTransform = new ColorTransform(1,1,1,1,10,0,0,0); bmd.draw(video); var rct:Rectangle = new Rectangle(0,0,video.width,video.height); var ba:ByteArray = new ByteArray(); ba = bmd.getPixels(rct); //trace(ba[0]); // Преобразуем в матрицу var image:Array = new Array(); for (var i:int=0;i<video.width;i++) { image[i] = new Array(); for (var j:int=0;j<video.height;j++) { image[i][j] = ba[i*video.width+j]; } } computeData(image); for (i=0;i<image.length;i++) { for (j=0;j<image[i].length;j++) { ba[i*video.width+j] = image[i][j]; } } bmd2.setPixels(rct,ba); bm.bitmapData = bmd2; } public function computeData(image:Array):void { for (var i:int=0;i<image.length;i++) { for (var j:int=0;j<image[i].height;j++) { image[i][j] = 0; } } } } } Просьба указать на ошибки и прокатит ли такой метод? Добавлено через 28 минут Отображается лишь video и то, почему-то черным экраном. Добавлено через 6 часов 54 минуты package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.BlendMode; import flash.display.Sprite; import flash.events.Event; import flash.events.NetStatusEvent; import flash.events.SecurityErrorEvent; import flash.geom.ColorTransform; import flash.geom.Matrix; import flash.geom.Point; import flash.geom.Rectangle; import flash.media.Video; import flash.net.NetConnection; import flash.net.NetStream; import flash.utils.ByteArray; public class Testvideo extends Sprite { private var videoURL:String = 'Deeper112.flv'; private var connection:NetConnection; private var stream:NetStream; private var video:Video = new Video(); public var bm:Bitmap; public var bm2:Bitmap; public function Testvideo() { connection = new NetConnection(); connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); connection.connect(null); } private function netStatusHandler(event:NetStatusEvent):void { switch (event.info.code) { case "NetConnection.Connect.Success": connectStream(); break; case "NetStream.Play.StreamNotFound": trace("Stream not found: " + videoURL); break; } } private function securityErrorHandler(event:SecurityErrorEvent):void { trace("securityErrorHandler: " + event); } private function connectStream():void { var stream:NetStream = new NetStream(connection); stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); video.attachNetStream(stream); stream.play(videoURL); addChild(video); bm = new Bitmap(); addChild(bm); bm.x = video.width+10; bm2 = new Bitmap(); addChild(bm2); bm2.y = video.height+10; addEventListener(Event.ENTER_FRAME,onEnterHandler); } public function onEnterHandler(e:Event):void { var bmd:BitmapData = new BitmapData(video.width,video.height); var bmd2:BitmapData = new BitmapData(video.width,video.height); //var mtx:Matrix = new Matrix(1,0,0,1,0,0); //var ct:ColorTransform = new ColorTransform(1,1,1,1,10,0,0,0); var rct:Rectangle = new Rectangle(0,0,video.width,video.height); var pt:Point = new Point(0,0); bm.bitmapData = bmd; bm2.bitmapData = bmd2; bmd.draw(video); //var ba:ByteArray = new ByteArray(); //ba = bmd.getPixels(rct); //ba.position = 0; //trace(ba[0]); // Преобразуем в матрицу //bmd2.copyPixels(bmd,rct,pt);/* var image:Array = new Array(); for (var i:uint=0;i<bmd.width;i++) { var tmp:Array = new Array(); for (var j:uint=0;j<bmd.height;j++) { var tmp2:uint = bmd.getPixel(i,j); tmp.push(tmp2); trace(tmp2); //bmd2.setPixel(i,j,tmp2); } image.push(tmp); } computeData(image); for (i=0;i<image.length;i++) { for (j=0;j<image[i].length;j++) { bmd2.setPixel(i,j,image[i][j]); } } } public function computeData(image:Object):void { for (var i:uint=0;i<image.length;i++) { for (var j:uint=0;j<image[i].length;j++) { image[i][j] = 0; } } } } } |
|
|||||
|
Bitmap и BitmapData достаточно одной.
package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.StageScaleMode; import flash.display.StageAlign; import flash.display.Sprite; import flash.events.Event; import flash.events.NetStatusEvent; import flash.events.SecurityErrorEvent; import flash.geom.Rectangle; import flash.media.Video; import flash.net.NetConnection; import flash.net.NetStream; public class Main extends Sprite { private var videoURL:String = "f_00770c.flv"; private var connection:NetConnection; private var stream:NetStream; private var video:Video = new Video(640, 360); private var bitmap:Bitmap = new Bitmap(); private var bd:BitmapData; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; connection = new NetConnection(); connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); connection.connect(null); } private function netStatusHandler(event:NetStatusEvent):void { switch (event.info.code) { case "NetConnection.Connect.Success": connectStream(); break; case "NetStream.Play.StreamNotFound": trace("Stream not found: " + videoURL); break; } } private function securityErrorHandler(event:SecurityErrorEvent):void { trace("securityErrorHandler: " + event); } private function connectStream():void { var stream:NetStream = new NetStream(connection); var client:Object = new Object(); client.onMetaData = onMetaData; stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); stream.client = client; video.attachNetStream(stream); stream.play(videoURL); bd = new BitmapData(video.width, video.height, false); bitmap.bitmapData = bd; bitmap.x = video.width; addChild(video); addChild(bitmap); } private function onMetaData(info:Object):void { trace("metadata: duration=" + info.duration + " width=" + info.width + " height=" + info.height + " framerate=" + info.framerate); addEventListener(Event.ENTER_FRAME, enterFrameHandler); } private function enterFrameHandler(event:Event):void { bd.draw(video); var randX:int = Math.random() * video.width - 20; var randY:int = Math.random() * video.height - 20; var rect:Rectangle = new Rectangle(randX, randY, 20, 20); bd.fillRect(rect, 0x00FF0000); } } } Если хотите получить массив значений пикселей, используйте метод getVector. "Преобразовывать в матрицу" смысла нет. Вы хотите залить все черным цветом? fillRect справится быстрее.
__________________
משיח לא בא משיח גם לא מטלפן Последний раз редактировалось alatar; 30.04.2012 в 14:14. |
|
|||||
|
Регистрация: Apr 2012
Сообщений: 26
|
Осталась лишь проблема с производительностью. Решил посредством таймера, чтоб частоту кадров не трогать.
Но ищу доп. способы повышения произв-ти. Сейчас у меня в цикле формируется массив getPixel'ем. Надо получить все-таки нормальный byteArray getPixels'ом и getVector заюзать. Цитата:
Вот сегментация изображения на 16 уровней. Но это тоже как бы проверка на работоспособность... public function computeData(image:Object):void { for (var i:uint=0;i<image.length;i++) { for (var j:uint=0;j<image[i].length;j++) { var pixelValue:uint = image[i][j]; var red:uint = pixelValue >> 16 & 0xFF; var green:uint = pixelValue >> 8 & 0xFF; var blue:uint = pixelValue & 0xFF; //red = Math.min(red+10,255);//+(Math.random()-0.5)*10; //green = Math.min(green+10,255);//+(Math.random()-0.5)*10; //blue = Math.min(blue+10,255);//+(Math.random()-0.5)*10;*/ /* //green = red = blue; //var module:Number = Math.sqrt(red*red+green*green+blue*blue); //if (red > 127) var color:uint = 0xFFFFFF; else color = 0;*/ var cnt:uint = 16; for(var k:uint=0;k<cnt;k++) { var nporog:uint = k/cnt*256; var vporog:uint = (k+1)/cnt*256; if (red>=nporog && red<vporog) var color:uint = (nporog+vporog)/2; } image[i][j] = color*256*256+color*256+color;//uint(red*256*256+green*256+blue) } } } Последний раз редактировалось sephira; 30.04.2012 в 15:41. |
|
|||||
|
Регистрация: Apr 2012
Сообщений: 26
|
Цитата:
По сути даже не кадра, а скриншота. Для моих задач подходит) |
|
|||||
|
Регистрация: Apr 2012
Сообщений: 26
|
Согласен. Я выше написал, что буду искать способы повышения производительности, за счет улучшения кода в том числе. Почитаю еще раз про getVector, чтоб понять подойдет ли мне. Мне нужно работать в растровой системе координат. И двухмерный массив вроде как лучше всего подходит.
Добавлено через 1 час 1 минуту C getVector'ом работает медленней. package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.NetStatusEvent; import flash.events.SecurityErrorEvent; import flash.geom.Rectangle; import flash.media.Video; import flash.net.NetConnection; import flash.net.NetStream; public class Testvideo extends Sprite { private var videoURL:String = "Deeper112.flv"; private var connection:NetConnection; private var stream:NetStream; private var video:Video = new Video(640, 360); private var bitmap:Bitmap = new Bitmap(); private var bd:BitmapData; public function Testvideo():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; connection = new NetConnection(); connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); connection.connect(null); } private function netStatusHandler(event:NetStatusEvent):void { switch (event.info.code) { case "NetConnection.Connect.Success": connectStream(); break; case "NetStream.Play.StreamNotFound": trace("Stream not found: " + videoURL); break; } } private function securityErrorHandler(event:SecurityErrorEvent):void { trace("securityErrorHandler: " + event); } private function connectStream():void { var stream:NetStream = new NetStream(connection); var client:Object = new Object(); client.onMetaData = onMetaData; stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); stream.client = client; video.attachNetStream(stream); stream.play(videoURL); bd = new BitmapData(video.width, video.height, false); bitmap.bitmapData = bd; bitmap.x = video.width; addChild(video); addChild(bitmap); } private function onMetaData(info:Object):void { trace("metadata: duration=" + info.duration + " width=" + info.width + " height=" + info.height + " framerate=" + info.framerate); addEventListener(Event.ENTER_FRAME, enterFrameHandler); } private function enterFrameHandler(event:Event):void { bd.draw(video); var v:Vector.<uint> = new Vector.<uint>(); var rct:Rectangle = new Rectangle(0,0,bd.width,bd.height); v = bd.getVector(rct); var image:Array = new Array(); for (var i:uint=0;i<bd.width;i++) { var tmp:Array = new Array(); for (var j:uint=0;j<bd.height;j++) { var tmp2:uint = v[i*bd.width+j]; tmp.push(tmp2); trace(tmp2); } image.push(tmp); } //computeData(image); for (i=0;i<image.length;i++) { for (j=0;j<image[i].length;j++) { v[i*image.length+j] = image[i][j]; } } bd.setVector(rct,v); } public function computeData(image:Object):void { for (var i:uint=0;i<image.length;i++) { for (var j:uint=0;j<image[i].length;j++) { /*var pixelValue:uint = image[i][j]; var red:uint = pixelValue >> 16 & 0xFF; var green:uint = pixelValue >> 8 & 0xFF; var blue:uint = pixelValue & 0xFF; //red = Math.min(red+10,255);//+(Math.random()-0.5)*10; //green = Math.min(green+10,255);//+(Math.random()-0.5)*10; //blue = Math.min(blue+10,255);//+(Math.random()-0.5)*10;*/ /* //green = red = blue; //var module:Number = Math.sqrt(red*red+green*green+blue*blue); //if (red > 127) var color:uint = 0xFFFFFF; else color = 0; var cnt:uint = 2; for(var k:uint=0;k<cnt;k++) { var nporog:uint = k/cnt*256; var vporog:uint = (k+1)/cnt*256; if (red>=nporog && red<vporog) var color:uint = (nporog+vporog)/2; } image[i][j] = color*256*256+color*256+color;//uint(red*256*256+green*256+blue)*/ /*var pixelValue:uint = image[i][j]; var red:uint = pixelValue >> 16 & 0xFF; var green:uint = pixelValue >> 8 & 0xFF; var blue:uint = pixelValue & 0xFF; if (red > 127) var color:uint = 0xFFFFFF; else color = 0; image[i][j] = color*256*256+color*256+color; var k:uint = (i-1>=0) ? i-1 : 0; var z:uint = (j-1>=0) ? j-1 : 0; //image[i][j] = Math.abs(image[i][j]-image[k][z]);*/ image[i][j] = 0; } } } } } Последний раз редактировалось sephira; 30.04.2012 в 15:53. |
|
|||||
|
Вот это:
var image:Array = new Array(); for (var i:uint=0;i<bd.width;i++) { var tmp:Array = new Array(); for (var j:uint=0;j<bd.height;j++) { var tmp2:uint = v[i*bd.width+j]; tmp.push(tmp2); trace(tmp2); } image.push(tmp); } выкиньте и будет быстрее. Этот код не имеет смысла.
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
|
Регистрация: Apr 2012
Сообщений: 26
|
Остановился пока на этом коде.
package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.NetStatusEvent; import flash.events.SecurityErrorEvent; import flash.geom.Rectangle; import flash.media.Video; import flash.net.NetConnection; import flash.net.NetStream; import flash.utils.ByteArray; import flash.utils.Timer; public class Testvideo extends Sprite { private var videoURL:String = "Deeper112.flv"; private var connection:NetConnection; private var stream:NetStream; private var video:Video = new Video(480, 360); private var bitmap:Bitmap = new Bitmap(); private var bitmap2:Bitmap = new Bitmap(); private var bd:BitmapData; private var bd2:BitmapData; public var myTimer:Timer = new Timer(50); public function Testvideo():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; connection = new NetConnection(); connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); connection.connect(null); } private function netStatusHandler(event:NetStatusEvent):void { switch (event.info.code) { case "NetConnection.Connect.Success": connectStream(); break; case "NetStream.Play.StreamNotFound": trace("Stream not found: " + videoURL); break; } } private function securityErrorHandler(event:SecurityErrorEvent):void { trace("securityErrorHandler: " + event); } private function connectStream():void { var stream:NetStream = new NetStream(connection); var client:Object = new Object(); client.onMetaData = onMetaData; stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); stream.client = client; video.attachNetStream(stream); stream.play(videoURL); bd = new BitmapData(video.width, video.height, false); bd2 = new BitmapData(video.width, video.height, false); bitmap.bitmapData = bd2; bitmap.x = video.width; bitmap2.bitmapData = bd; addChild(video); addChild(bitmap); } private function onMetaData(info:Object):void { trace("metadata: duration=" + info.duration + " width=" + info.width + " height=" + info.height + " framerate=" + info.framerate); myTimer.addEventListener("timer", enterFrameHandler); myTimer.start(); } private function enterFrameHandler(event:Event):void { bd.draw(video); var image:Array = new Array(); for (var i:uint=0;i<bd.width;i++) { image[i] = new Array(); for (var j:uint=0;j<bd.height;j++) { image[i][j] = bd.getPixel(i,j); } } computeData(image); for (i=0;i<image.length;i++) { for (j=0;j<image[i].length;j++) { bd2.setPixel(i,j,image[i][j]); } } } public function computeData(image:Array):void { segmentation(image,4); } public function binarization(image:Array):void { for (var i:uint=0;i<image.length;i++) { for (var j:uint=0;j<image[i].length;j++) { var pixelValue:uint = image[i][j]; var red:uint = pixelValue >> 16 & 0xFF; var green:uint = pixelValue >> 8 & 0xFF; var blue:uint = pixelValue & 0xFF; if (red > 127) var color:uint = 0xFFFFFF; else color = 0; image[i][j] = color*256*256+color*256+color; } } } public function segmentation(image:Array,cnt:uint):void { for (var i:uint=0;i<image.length;i++) { for (var j:uint=0;j<image[i].length;j++) { var pixelValue:uint = image[i][j]; var red:uint = pixelValue >> 16 & 0xFF; var green:uint = pixelValue >> 8 & 0xFF; var blue:uint = pixelValue & 0xFF; for(var k:uint=0;k<cnt;k++) { var nporog:uint = k/cnt*256; var vporog:uint = (k+1)/cnt*256; if (red>=nporog && red<vporog) var color:uint = (nporog+vporog)/2; } image[i][j] = color*256*256+color*256+color; } } } } } Цитата:
Добавлено через 3 минуты Повторяюсь, для всех методов, которые надо будет реализовать нужна растровая система координат. |
![]() |
![]() |
Часовой пояс GMT +4, время: 01:33. |
|
|
« Предыдущая тема | Следующая тема » |
|
|