コメントもらった
http://un-q.net/2007/12/post_20.html#comment-13250
あと、すごくあつかましいと思うのですが、もし支障がないようでしたらよろしければソースを見せていただけないでしょうか?
初対面(?)なのにこんな事聞いていいのか迷ったですが、ほんとに「もしよければ」でいいので、よければ勉強させてください、
よろしくお願いします。
ということでしたので、まだ作ってる途中でぐちゃぐちゃだけど公開しておきます。
ソースは途中でもいいから公開した方がいいよいいよーって誰かが言ってた気もするし。
だれか添削してくださいな
ActionScript3.0 ColorTracking UI 赤色でをカーソルとして認識
http://labs.un-q.net/as3/camera/colorTracking/03/
package {
import flash.display.*;
import flash.events.*;
import flash.geom.*;
import flash.media.Camera;
import flash.media.Video;
import net.un_q.utils.ColorUtil;
public class ColorTracking03 extends Sprite {
private var camera:Camera;
private var video:Video;
private var srcbd:BitmapData;
private var viewbd:BitmapData;
private var greenbd:BitmapData;
private var bluebd:BitmapData;
private var drawbmd:BitmapData;
private var mt:Matrix;
private var mirrorMt:Matrix;
private var pt:Point;
private var rect:Rectangle;
private var ct:ColorTransform;
private var w:int;
private var h:int;
private var drawsp:Sprite;
private var g:Graphics;
private var nowx:int;
private var nowy:int;
private var penFlag:Boolean = false;
public function ColorTracking03() {
init();
}
private function init():void {
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
camera = Camera.getCamera();
if (camera != null) {
setupCamera();
} else {
trace("not camera");
return;
}
w = camera.width*2;
h = camera.height*2;
srcbd = new BitmapData(w, h ,false,0xff000000);
viewbd = new BitmapData(w, h, false, 0xff000000);
greenbd = new BitmapData(w, h);
bluebd = new BitmapData(w, h);
drawbmd = new BitmapData(w, h, true, 0x00ffffff);
mirrorMt = new Matrix();
mirrorMt.scale(-1, 1);
mirrorMt.translate(w,0);
pt = new Point(0,0);
rect = new Rectangle(0,0,w, h);
ct = new ColorTransform();
mt = new Matrix();
addChild(new Bitmap(srcbd));
var v:DisplayObject = addChild(new Bitmap(viewbd));
v.x = w + 10;
addEventListener(Event.ENTER_FRAME, loop);
// Sprite drawsp
drawsp = new Sprite();
addChild(drawsp);
drawsp.y = h + 10;
g = drawsp.graphics;
g.beginFill(0xffffff);
g.drawRect(0,0,w,h);
g.endFill();
g.lineStyle(2, 0x000000,1,false,"normal",CapsStyle.ROUND,JointStyle.ROUND,3);
stage.addEventListener(KeyboardEvent.KEY_DOWN, function(e:KeyboardEvent):void {
switch (e.keyCode) {
case 67:
//c
g.beginFill(0xffffff);
g.drawRect(0,0,w,h);
g.endFill();
break;
case 86:
g.lineStyle(2, ColorUtil.randomRGB(),1,false,"normal",CapsStyle.ROUND,JointStyle.ROUND,3);
break;
}
trace(e.keyCode);
});
}
private function setupCamera():void {
video = new Video(camera.width*2, camera.height*2);
video.attachCamera(camera);
}
private function loop(e:Event):void {
srcbd.lock();
viewbd.lock();
greenbd.lock();
bluebd.lock();
srcbd.draw(video,mirrorMt);
viewbd.draw(video,mirrorMt);
greenbd.copyChannel(srcbd, rect, pt, BitmapDataChannel.GREEN, BitmapDataChannel.RED);
bluebd.copyChannel(srcbd, rect, pt, BitmapDataChannel.BLUE, BitmapDataChannel.RED);
bluebd.draw(greenbd, mt, ct, BlendMode.LIGHTEN);
viewbd.draw(bluebd, mt,ct, BlendMode.SUBTRACT);
viewbd.threshold(viewbd, rect, pt, ">", 0xff600000, 0xffffffff);
viewbd.threshold(viewbd, rect, pt, "!=", 0xffffffff, 0xff000000);
srcbd.unlock();
viewbd.unlock();
greenbd.unlock();
bluebd.unlock();
draw();
}
private function draw():void {
var r:Rectangle = viewbd.getColorBoundsRect(0xffffffff, 0xffffffff);
if (r.x == 0 && r.y == 0) {
g.moveTo(nowx,nowy);
penFlag = false;
return;
} else {
}
if (!penFlag) g.moveTo(r.x, r.y);
g.lineTo(r.x, r.y);
penFlag = true;
nowx = r.x;
nowy = r.y;
}
}
}