i looking @ face detection example found in zip file here:
the example loads image , highlights face black rectangle. save resulting image, in other words, annotate image square , nothing else (just image , square, not entire stage).
so far can save image processing bitmap data , resaving it, cannot save 'square'. i've tried copying line draws square , drawing bitmap object, tried drawing on sprite, , i've tried using matrix figuring being drawn out of bounds. no luck.
below original code followed futile attempts (i realize saves blank white image, trying see if draw square):
package { import flash.display.stagescalemode; import flash.display.stagealign; import flash.display.sprite; import flash.display.loader; import flash.display.bitmap; import flash.display.bitmapdata; import flash.display.graphics; import flash.events.event; import flash.geom.rectangle; import flash.net.urlrequest; import flash.text.textfield; import jp.maaash.objectdetection.objectdetector; import jp.maaash.objectdetection.objectdetectoroptions; import jp.maaash.objectdetection.objectdetectorevent; import flash.utils.gettimer; public class facedetector extends sprite{ private var debug :boolean = true; private var detector :objectdetector; private var options :objectdetectoroptions; private var faceimage :loader; private var bmptarget :bitmap; private var view :sprite; private var facerectcontainer :sprite; private var tf :textfield; private var lasttimer:int = 0; public function facedetector() { initui(); initdetector(); faceimage.load( new urlrequest("013.jpg") ); } private function initui():void{ stage.scalemode = stagescalemode.no_scale; stage.align = stagealign.top_left; view = new sprite; addchild(view); faceimage = new loader; faceimage.contentloaderinfo.addeventlistener( event.complete, function(e :event) :void { startdetection(); }); view.addchild( faceimage ); facerectcontainer = new sprite; view.addchild( facerectcontainer ); tf = new textfield; tf.x = 256; tf.width = 600; tf.height = 300; tf.textcolor = 0x000000; tf.multiline = true; view.addchild( tf ); } private function initdetector():void{ detector = new objectdetector; detector.options = getdetectoroptions(); detector.addeventlistener(objectdetectorevent.detection_complete,function( e :objectdetectorevent ):void{ logger("[objectdetectorevent.complete]"); tf.appendtext( "\ntime: "+(new date)+" "+e.type ); detector.removeeventlistener( objectdetectorevent.detection_complete, arguments.callee ); if( e.rects ){ var g :graphics = facerectcontainer.graphics; g.clear(); g.linestyle( 2 ); // black 2pix e.rects.foreach( function( r :rectangle, idx :int, arr :array ) :void { g.drawrect( r.x, r.y, r.width, r.height ); }); } }); detector.addeventlistener( objectdetectorevent.detection_start, function(e :objectdetectorevent) :void { tf.appendtext( "\ntime: "+(new date)+" "+e.type ); }); } private function startdetection():void{ logger("[startdetection]"); bmptarget = new bitmap( new bitmapdata( faceimage.width, faceimage.height, false ) ) bmptarget.bitmapdata.draw( faceimage ); detector.detect( bmptarget.bitmapdata ); } private function getdetectoroptions() :objectdetectoroptions { options = new objectdetectoroptions(); options.min_size = 50; return options; } private function logger(... args):void{ if(!debug){ return; } trace( args, gettimer(), gettimer() - lasttimer); lasttimer = gettimer(); } } } my code:
package { import flash.display.stagescalemode; import flash.display.stagealign; import flash.display.sprite; import flash.display.loader; import flash.display.bitmap; import flash.display.bitmapdata; import flash.display.graphics; import flash.events.event; import flash.geom.*;//rectangle; import flash.net.urlrequest; import flash.text.textfield; import jp.maaash.objectdetection.objectdetector; import jp.maaash.objectdetection.objectdetectoroptions; import jp.maaash.objectdetection.objectdetectorevent; import com.adobe.images.*; import flash.utils.gettimer; //// import flash.filesystem.*; import flash.utils.bytearray; //// public class facedetector extends sprite{ private var debug :boolean = true; private var detector :objectdetector; private var options :objectdetectoroptions; private var faceimage :loader; private var bmptarget :bitmap; private var view :sprite; private var facerectcontainer :sprite; private var tf :textfield; private var lasttimer:int = 0; public function facedetector() { initui(); initdetector(); faceimage.load( new urlrequest("013.jpg") ); } private function initui():void{ stage.scalemode = stagescalemode.no_scale; stage.align = stagealign.top_left; view = new sprite; addchild(view); faceimage = new loader; faceimage.contentloaderinfo.addeventlistener( event.complete, function(e :event) :void { startdetection(); }); view.addchild( faceimage ); facerectcontainer = new sprite; view.addchild( facerectcontainer ); tf = new textfield; tf.x = 256; tf.width = 600; tf.height = 300; tf.textcolor = 0x000000; tf.multiline = true; view.addchild( tf ); } private function initdetector():void{ detector = new objectdetector; detector.options = getdetectoroptions(); detector.addeventlistener(objectdetectorevent.detection_complete,function( e :objectdetectorevent ):void{ logger("[objectdetectorevent.complete]"); tf.appendtext( "\ntime: "+(new date)+" "+e.type ); detector.removeeventlistener( objectdetectorevent.detection_complete, arguments.callee ); var rt:sprite = new sprite(); var bmprt:bitmap = new bitmap( new bitmapdata( faceimage.width, faceimage.height, false ) ); var matrix:matrix = new matrix(); var rect:rectangle = new rectangle(); if( e.rects ){ var g :graphics = facerectcontainer.graphics; g.clear(); g.linestyle( 2 ); // black 2pix e.rects.foreach( function( r :rectangle, idx :int, arr :array ) :void { g.drawrect( r.x, r.y, r.width, r.height ); matrix.translate(-r.x, -r.y); rect = r; rt.graphics.drawrect(r.x, r.y, r.width, r.height ); }); } var file:file = file.applicationstoragedirectory.resolvepath("testoutput.jpg"); var fs:filestream = new filestream(); var bytearray:bytearray; var jpgencoder:jpgencoder = new jpgencoder( 90 ); //rt.graphics.draw(g); bmptarget.bitmapdata.draw(rt); bmprt.bitmapdata.draw(rt, matrix); bytearray = jpgencoder.encode( bmprt.bitmapdata ); fs.open(file, filemode.write); fs.writebytes(bytearray); fs.close(); }); detector.addeventlistener( objectdetectorevent.detection_start, function(e :objectdetectorevent) :void { tf.appendtext( "\ntime: "+(new date)+" "+e.type ); }); } private function startdetection():void{ logger("[startdetection]"); bmptarget = new bitmap( new bitmapdata( faceimage.width, faceimage.height, false ) ) bmptarget.bitmapdata.draw( faceimage ); detector.detect( bmptarget.bitmapdata ); } private function getdetectoroptions() :objectdetectoroptions { options = new objectdetectoroptions(); options.min_size = 50; return options; } private function logger(... args):void{ if(!debug){ return; } trace( args, gettimer(), gettimer() - lasttimer); lasttimer = gettimer(); } } } tl;dr:
how load image, draw square on it, , save result, assuming know how load , save images?
any appreciated, in advance.
edit
here final code interested:
package { import flash.display.stagescalemode; import flash.display.stagealign; import flash.display.sprite; import flash.display.loader; import flash.display.bitmap; import flash.display.bitmapdata; import flash.display.graphics; import flash.events.event; import flash.geom.*;//rectangle; import flash.net.urlrequest; import flash.text.textfield; import jp.maaash.objectdetection.objectdetector; import jp.maaash.objectdetection.objectdetectoroptions; import jp.maaash.objectdetection.objectdetectorevent; import com.adobe.images.*; import flash.utils.gettimer; //// import flash.filesystem.*; import flash.utils.bytearray; //// public class facedetector extends sprite{ private var debug :boolean = true; private var detector :objectdetector; private var options :objectdetectoroptions; private var faceimage :loader; private var bmptarget :bitmap; private var view :sprite; private var facerectcontainer :sprite; private var tf :textfield; private var lasttimer:int = 0; public function facedetector() { initui(); initdetector(); faceimage.load( new urlrequest("013.jpg") ); } private function initui():void{ stage.scalemode = stagescalemode.no_scale; stage.align = stagealign.top_left; view = new sprite; addchild(view); faceimage = new loader; faceimage.contentloaderinfo.addeventlistener( event.complete, function(e :event) :void { startdetection(); }); view.addchild( faceimage ); facerectcontainer = new sprite; view.addchild( facerectcontainer ); tf = new textfield; tf.x = 256; tf.width = 600; tf.height = 300; tf.textcolor = 0x000000; tf.multiline = true; view.addchild( tf ); } private function initdetector():void{ detector = new objectdetector; detector.options = getdetectoroptions(); detector.addeventlistener(objectdetectorevent.detection_complete,function( e :objectdetectorevent ):void{ logger("[objectdetectorevent.complete]"); tf.appendtext( "\ntime: "+(new date)+" "+e.type ); detector.removeeventlistener( objectdetectorevent.detection_complete, arguments.callee ); var bmprt:bitmap = new bitmap( new bitmapdata( faceimage.width, faceimage.height, false ) ); if( e.rects ){ var g :graphics = facerectcontainer.graphics; g.clear(); g.linestyle(3, 0xff0000, 1); // black 2pix--- parameters(thicknes in pixels, color in hex, alpha (0-1)) e.rects.foreach( function( r :rectangle, idx :int, arr :array ) :void { g.drawrect( r.x, r.y, r.width, r.height ); }); } var file:file = file.applicationstoragedirectory.resolvepath("testoutput.jpg"); var fs:filestream = new filestream(); var bytearray:bytearray; var jpgencoder:jpgencoder = new jpgencoder( 90 ); bmprt.bitmapdata.draw(faceimage); bmprt.bitmapdata.draw(facerectcontainer); bytearray = jpgencoder.encode( bmprt.bitmapdata ); fs.open(file, filemode.write); fs.writebytes(bytearray); fs.close(); }); detector.addeventlistener( objectdetectorevent.detection_start, function(e :objectdetectorevent) :void { tf.appendtext( "\ntime: "+(new date)+" "+e.type ); }); } private function startdetection():void{ logger("[startdetection]"); bmptarget = new bitmap( new bitmapdata( faceimage.width, faceimage.height, false ) ) bmptarget.bitmapdata.draw( faceimage ); detector.detect( bmptarget.bitmapdata ); } private function getdetectoroptions() :objectdetectoroptions { options = new objectdetectoroptions(); options.min_size = 50; return options; } private function logger(... args):void{ if(!debug){ return; } trace( args, gettimer(), gettimer() - lasttimer); lasttimer = gettimer(); } } } thanks vesper help.
well, load image bitmap, determine draw rectangle, create shape , draw rectangle on graphics, call bitmap.bitmapdata.draw(shape) draw rectangle on loaded bitmap, save bitmap. in code, after you've prepared rectangles, this:
bmprt.bitmapdata.copypixels(faceimage.bitmapdata,faceimage.bitmapdata.rect,new point()); bmprt.bitmapdata.draw(facerectcontainer); then save bmprt do.
Comments
Post a Comment