0

カメラ入力からキャプチャしたビットマップをベクトルに変換してから、後で使用するためにベクトル ポイントを配列に変換しようとしています。

ただし、Flash 内にそのような機能が見つからないため、Corey O'Neilによって作成された「Vectorization Package」を使用しようとしています。これは機能しているように見えますが、ビットマップの白い背景を削除できません (線のある紙の写真をキャプチャしています)。手動でこれを行って背景を透明にしても、結果は得られません。

これが私のコードです:

public class DocumentRich extends MovieClip{

    public var initBox2D:Main;
    var cam:Camera = Camera.getCamera(); 
    var vid:Video = new Video(420, 300); 
    var myVector:Vectorize;
    public function DocumentRich()
    {
        if(stage){
            initBox2D = new Main();
            addChild(initBox2D);
            //addChild(new movieMonitor());
        } 

        addEventListener(MouseEvent.CLICK, clickHandler, false, 0, true);
        StartAnim();


    }

    function StartAnim():void
    {
        //SET UP WORLD
        initBox2D.isDebugMode(false);
        initBox2D.mouseDragEnabled(true);
        Main.world.SetGravity(new b2Vec2(0,0));


        cam.setQuality(0, 100);
        cam.setMode(420, 300, 30, true);
        trace(cam.height);
        vid.attachCamera(cam); 
        addChild(vid);
        addChild(go);
    }

    function clickHandler(m:MouseEvent){
        trace(m.target.name);
        switch(m.target.name){
            case 'go':
                goButtonFun();
            break;

        }
    }

    function goButtonFun():void{
        var screenShot:BitmapData = new BitmapData(cam.width, cam.height); 
        var screenShot_image:Bitmap=new Bitmap(screenShot);
        screenShot.draw(vid) ;
        ReduceColors.reduceColors(screenShot, 0, true, false);
        screenShot.colorTransform(new Rectangle(0, 0, screenShot.width, screenShot.height), new ColorTransform(2,2,2,1) );

        ///// --------- MAY NOT NEED THIS ----------- ////////////
        for(var i:int = 0; i<screenShot.width; i++)
        {
            for(var j:int = 0; j<screenShot.height; j++)
            {
                if(screenShot.getPixel(i,j) == 0xffffff)
                {
                    var transparent:uint = 0x00000000;
                    screenShot.setPixel32(i, j, transparent);
                }
            }
        }

        myVector = new Vectorize(screenShot_image, 23, 2, 1, 3, 0xFFFFFF);
        myVector.addEventListener(Vectorize.INIT, traceStatus);
        myVector.addEventListener(Vectorize.DESPECKLE_START, traceStatus);
        myVector.addEventListener(Vectorize.DESPECKLE_COMPLETE, traceStatus);
        myVector.addEventListener(Vectorize.GROUPING_START, traceStatus);
        myVector.addEventListener(Vectorize.GROUPING_COMPLETE, traceStatus);
        myVector.addEventListener(Vectorize.EDGING_START, traceStatus);
        myVector.addEventListener(Vectorize.EDGING_COMPLETE, traceStatus);

        myVector.addEventListener(Vectorize.DESPECKLE_PROGRESS, traceProgress);
        myVector.addEventListener(Vectorize.GROUPING_PROGRESS, traceProgress);
        myVector.addEventListener(Vectorize.EDGING_PROGRESS, traceProgress);

        myVector.addEventListener(Vectorize.COMPLETE, showVector);
        myVector.vectorize();

        //addChild(screenShot_image);
        addChild(go);
        removeChild(vid);
        cam = null;
        vid.attachCamera(null);
        vid = null;
    }

    function traceStatus(event:Event):void
    {
        trace(event.type);
    }
    function traceProgress(event:Event):void
    {
        var progress:int = event.target.percentDone * 100;
        trace(event.type + ": " + progress + "%");
    }
    function showVector(event:Event):void
    {
        trace(event.type);
        addChild(myVector);
    }

}

助言がありますか?

ありがとう。

更新: 混乱して申し訳ありません。基本的に、透明なビットマップをトレースし、そのビットマップ内の形状のポイントの配列を取得する方法が必要です。ピクセル データの配列が大きすぎます...サイズに関係なく、四角形に 4 つのポイントが必要です...

4

1 に答える 1

0

どうやらBitmapData.getVector()を探しているようです。Flash Player 10 から利用できるので、自由に使用できるはずです。

編集:あなたの質問を読み直した後、ビットマップをベクトルに解析したいことを理解しました-ベクトルはピクセルの配列ではなく、特定の行の開始と終了です。はい、threshold()線のピクセルがある色になり、背景が別の色になるようにa を呼び出すことができる場合getColorBoundsRect()は、四角形の 4 つのコーナーすべてを呼び出してクエリを実行できます。線の色のものは開始座標と終了座標です。これらを保存します。

于 2013-10-24T18:24:56.890 に答える