![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Apr 2012
Сообщений: 26
|
Впереди методы сложнее)))
Добавлено через 16 минут 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 TestVideo2 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 bd:BitmapData; public var myTimer:Timer = new Timer(50); public function TestVideo2():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); myTimer.addEventListener("timer", enterFrameHandler); myTimer.start(); } 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); computeData(v,bd.width,bd.height); bd.setVector(rct,v); } public function computeData(v:Vector.<uint>,w:uint,h:uint):void { segmentation(v,w,h,4); } public function binarization(v:Vector.<uint>,w:uint,h:uint):void { for (var i:uint=0;i<w;i++) { for (var j:uint=0;j<h;j++) { var pixelValue:uint = getUint(v,w,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; setUint(v,i,j,w,color*256*256+color*256+color); } } } public function segmentation(v:Vector.<uint>,w:uint,h:uint,cnt:uint):void { for (var i:uint=0;i<w;i++) { for (var j:uint=0;j<h;j++) { var pixelValue:uint = getUint(v,w,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; } setUint(v,i,j,w,color*256*256+color*256+color); } } } public function getUint (v:Vector.<uint>,width:uint,i:uint,j:uint):uint { var tmp:uint = i*width+j; return v[tmp]; } public function setUint (v:Vector.<uint>,i:uint,j:uint,width:uint,value:uint):void { var tmp:uint = i*width+j; v[tmp] = value; } } } Добавлено через 30 минут Собственно, проблемная строка Что не так? Последний раз редактировалось sephira; 30.04.2012 в 18:04. |
|
|||||
|
Эти два метода реализуются с помощью метода paletteMap без явных переборов.
Добавлено через 1 минуту Цитата:
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
|
Регистрация: Apr 2012
Сообщений: 26
|
Цитата:
Вот еще методы. public function medianFilter(image:Array):void { for (var i:uint=0;i<image.length-1;i++) { for (var j:uint=0;j<image[i].length-1;j++) { var tmp:Array = new Array(); for(var a:uint=0;a<2;a++) { for(var b:uint=0;b<2;b++) { tmp[a*2+b] = image[i+a][i+b]; } } tmp.sort(Array.NUMERIC); image[i][j] = tmp[1]; tmp = undefined; } } } public function uniformNoise(image:Array):void { for (var i:uint=0;i<image.length-1;i++) { for (var j:uint=0;j<image[i].length-1;j++) { image[i][j] = image[i][j]+(Math.random()-0.5)*10; } } } public function maxRGB(image:Array):void { for (var i:uint=0;i<image.length-1;i++) { for (var j:uint=0;j<image[i].length-1;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>=green) { if(red>=blue) { image[i][j] = red*256*256; } else { image[i][j] = blue; } } else { if(green>=blue) { image[i][j] = green*256; } else { image[i][j] = blue; } } } } } Но это как бы все разминка перед распознаванием образов, движения, вычислением скорости и т.п. Последний раз редактировалось sephira; 30.04.2012 в 19:51. |
|
|||||
|
Цитата:
Добавлено через 6 минут sephira, еще раз. Забудьте вы о своем image[i][j]. Вы гоняете кучу циклов, что естественно будет тормозить (тем более в дебаг-плеере. в релизе будет быстрее). Вот пример, раз уж вы так любите решения в лоб: private function segmetize2(v:Vector.<uint>, cnt:uint):void { var n:int = v.length; for (var i:int = 0; i < n; i++) { var red:uint = v[i] >> 16 & 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; } v[i] = color * 256 * 256 + color * 256 + color; } } Да и вот это: 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; } Добавлено через 12 минут Оффтоп. Вам когда курсач сдавать?
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
|
Modus ponens
|
Свои 5 копеек добавлю. Как бы ну совсем нехорошая идея, особенно, принимая во внимание то, что в AS3 арифметика реализована только для чисел с плавающей запятой. Т.е. тут получится каст из целого в дробное, умножение, потом еще и сложение чисел с плавающей запятой, а потом каст обратно к целому. Это и расход памяти и медленно, но, самое главное чревато неточностью / неожиданными последствиями, если вдруг результат окажется больше чем максимальное значение канала.
__________________
Hell is the possibility of sanity |
|
|||||
|
Регистрация: Apr 2012
Сообщений: 26
|
Дебаггер Flash Builder'а
В течение мая. wvxvw учту Добавлено через 17 минут Failed to connect; session timed out. Ensure that: 1. You compiled your Flash application with debugging on. 2. You are running the debugger version of Flash Player. Это из-за хрома. Разобрался. Последний раз редактировалось sephira; 30.04.2012 в 22:05. |
|
|||||
|
Регистрация: 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 TestVideo2 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 bd:BitmapData; public var myTimer:Timer = new Timer(100); public function TestVideo2():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } public function getUint (v:Vector.<uint>,width:uint,i:uint,j:uint):uint { var tmp:uint = i+j*width; return v[tmp]; } public function setUint (v:Vector.<uint>,i:uint,j:uint,width:uint,value:uint):void { var tmp:uint = i+j*width; v[tmp] = value; } 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); myTimer.addEventListener("timer", enterFrameHandler); myTimer.start(); } 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); computeData(v,bd.width,bd.height); bd.setVector(rct,v); } public function computeData(v:Vector.<uint>,w:uint,h:uint):void { maxRGB(v,w,h); } public function binarization(v:Vector.<uint>,w:uint,h:uint):void { for (var i:uint=0;i<w;i++) { for (var j:uint=0;j<h;j++) { var pixelValue:uint = getUint(v,w,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; var tmp:uint = color * 256 * 256 + color * 256 + color; v[i] = tmp; } } } private function segmentation(v:Vector.<uint>,w:uint,h:uint,cnt:uint):void { var n:int = v.length; var levels:Array = new Array(); for(var k:uint=0; k < cnt; k++) { levels[k] = k/cnt*256; } for (var i:int = 0; i < n; i++) { var red:uint = v[i] >> 16 & 0xFF; for(k = 0; k < cnt; k++) { if(red>=levels[k] && red<levels[k+1]) { var color:uint = levels[k]; } } var tmp:uint = color * 256 * 256 + color * 256 + color; v[i] = tmp; } } public function medianFilter(v:Vector.<uint>,w:uint,h:uint):void { for (var i:uint=0;i<w;i++) { for (var j:uint=0;j<h;j++) { var tmp:Array = new Array(); for(var a:uint=0;a<3;a++) { for(var b:uint=0;b<3;b++) { tmp[a*3+b] = getUint(v,w,i+a,j+b); } } tmp.sort(Array.NUMERIC); setUint(v,i+1,j+1,w,tmp[5]); tmp = undefined; } } } public function uniformNoise(v:Vector.<uint>,w:uint,h:uint):void { for (var i:uint=0;i<w;i++) { for (var j:uint=0;j<h;j++) { var pixelValue:uint = getUint(v,w,i,j); var red:uint = pixelValue >> 16 & 0xFF; var green:uint = pixelValue >> 8 & 0xFF; var blue:uint = pixelValue & 0xFF; red = Math.min(255,red+(Math.random()-0.5)*10); green = Math.min(255,green+(Math.random()-0.5)*10); blue = Math.min(255,blue+(Math.random()-0.5)*10); var tmp:uint = red*256*256+green*256+blue; setUint(v,i,j,w,tmp); } } } public function maxRGB(v:Vector.<uint>,w:uint,h:uint):void { for (var i:uint=0;i<w;i++) { for (var j:uint=0;j<h;j++) { var pixelValue:uint = getUint(v,w,i,j); var red:uint = pixelValue >> 16 & 0xFF; var green:uint = pixelValue >> 8 & 0xFF; var blue:uint = pixelValue & 0xFF; if(red>=green) { if(red>=blue) { setUint(v,i,j,w,red*256*256); } else { setUint(v,i,j,w,blue); } } else { if(green>=blue) { setUint(v,i,j,w,green*256); } else { setUint(v,i,j,w,blue); } } } } } public function mediumRGB(v:Vector.<uint>,w:uint,h:uint):void { for (var i:uint=0;i<w;i++) { for (var j:uint=0;j<h;j++) { var pixelValue:uint = getUint(v,w,i,j); var red:uint = pixelValue >> 16 & 0xFF; var green:uint = pixelValue >> 8 & 0xFF; var blue:uint = pixelValue & 0xFF; var color:uint = (red+green+blue)/3; var tmp:uint = color*256*256+color*256+color; setUint(v,i,j,w,tmp); } } } } } При сегментации 128 уровней уже явные тормоза. Цитата:
Последний раз редактировалось sephira; 01.05.2012 в 00:11. |
|
|||||
|
Возможно я и ошибаюсь, давно не делал курсовые.
Просто вы рискуете, выбрав малознакомую платформу для довольно ограниченных сроков.Оставьте пока попытки с видео, сосредоточьтеся на статических изображениях. Рассмотрите возможность использования AGAL или шейдеров Pixel Bender, если важна производительность (но там свои особенности). Поищите готовые решения, если не для применения, то хоть для примера. После реализации всех методов займитесь оптимизацией, это будет проще, чем пытаться сразу написать оптимально.
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
|
Регистрация: Apr 2012
Сообщений: 26
|
public function contours(v:Vector.<uint>,w:uint,h:uint):void { for (var i:uint=1;i<w-1;i++) { for (var j:uint=1;j<h-1;j++) { var pixelValuepm1:uint = getUint(v,w,i+1,j-1); //св var pixelValuep1:uint = getUint(v,w,i+1,j); //в var pixelValuepp1:uint = getUint(v,w,i+1,j+1); //юв var pixelValue1m:uint = getUint(v,w,i,j-1); //с var pixelValue1:uint = getUint(v,w,i,j); //ц var pixelValue1p:uint = getUint(v,w,i,j+1); //ю var pixelValuemm1:uint = getUint(v,w,i-1,j-1); //сз var pixelValuem1:uint = getUint(v,w,i-1,j); //з var pixelValuemp1:uint = getUint(v,w,i-1,j+1); //юз var a:uint = pixelValuepm1 - pixelValuemm1; var b:uint = 2*pixelValuep1 - 2*pixelValuem1; var c:uint = pixelValuepp1 - pixelValuemp1; var dfdx:Number = (a+b+c)/6; var d:uint = -pixelValuemp1 + pixelValuemm1; var e:uint = -2*pixelValue1p + 2*pixelValue1m; var f:uint = -pixelValuepp1 + pixelValuepm1; var dfdy:Number = (d+e+f)/6; var ma:Number = Math.max(Math.abs(dfdx),Math.abs(dfdy)); var tmp:uint = (ma<7.14E8) ? 0xFFFFFF : 0x000000; setUint(v,i,j,w,tmp); } } } Добавлено через 2 минуты Тем более всегда есть возможность пересесть на OpenCV. Но его также надо изучать. Добавлено через 4 минуты AGAL, Pixel Bender учту, спасибо) |
![]() |
![]() |
Часовой пояс GMT +4, время: 01:35. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|