0

FLARToolkit という Flash プラグインを使用して、拡張現実でビデオ クリップを再生しようとしています。グリーン スクリーン ビデオがあり、飛行機でビデオを再生する必要があります。現在、MovieClipMaterial を使用してビデオをディスプレイ プレーンに配置しています。ディスプレイ プレーンのピクセルを繰り返し処理し、緑色の画面の緑色に一致するピクセルを変更し、それらのピクセルを透明なクロマ キーに設定したいと考えています。これを行うためのより効率的な方法があるかもしれません。私は提案を受け付けています。

ColorMatrixFilters も調べましたが、クリップ内のすべての緑を除外するのではなく、選択的にする方法を考案できませんでした。

現在の私のコードは次のとおりです。

[SWF(width='640', height='480', backgroundColor='#000000', frameRate='40')]

public class HelloFLAR extends Sprite
{
    private var fm:FLARManager;
    private var scene:Scene3D;
    private var view:Viewport3D;
    private var camera:FLARCamera3D;
    private var bre:BasicRenderEngine;
    private var lre:LazyRenderEngine;
    private var p:Plane;
    private var con:DisplayObject3D;
    private var marker:FLARMarker;
    private var v:Vid;
    private var mat:MovieMaterial
    private var bmd:BitmapData;
    private var videoStream:NetStream;
    private var container:FLARBaseNode;
    private var RGBRaster:FLARRgbRaster_BitmapData;

    public function HelloFLAR()
    {
        initFLAR();
        v = new Vid();
        //source for displayed video
        v.vid.source = "Reuters.m4v";
        v.vid.stop();

    }

    private function initFLAR():void
    {
        fm = new FLARManager("flarConfig.xml");
        fm.addEventListener(FLARMarkerEvent.MARKER_ADDED, onAdded);
        fm.addEventListener(FLARMarkerEvent.MARKER_REMOVED, onRemoved);
        fm.addEventListener(Event.INIT, init3D);
        addChild(Sprite(fm.flarSource));


    }

    private function onAdded(e:FLARMarkerEvent):void
    {
        marker = e.marker;
        p.visible = true;
        v.vid.play();
    }

    private function onRemoved(e:FLARMarkerEvent):void
    {
        marker = null;
        p.visible = false;
        v.vid.stop();
    }

    private function init3D(e:Event):void
    {
        scene = new Scene3D();
        camera = new FLARCamera3D(fm.cameraParams);
        camera.z = -30;
        view = new Viewport3D(640, 480, true);
        lre = new LazyRenderEngine(scene,camera,view);


        //Display plane and Videp material
        mat = new MovieMaterial(v, false, true);
        p = new Plane(mat, 320, 240, 2, 2);
        mat.doubleSided = true;
        p.rotationZ = 90;
        p.visible = true;


        //Green Leech from video plane (Attempt at chromakeying)
        var matrix:Array = new Array();         
        matrix = matrix.concat([1,0,0,0,0]); //Red
        matrix = matrix.concat([0,1,0,0,0]); //Green
        matrix = matrix.concat([0,0,1,0,0]); //Blue
        matrix = matrix.concat([0,-1,0,0,0]); //Alpha

        var color_filter:ColorMatrixFilter = new ColorMatrixFilter(matrix);;
        v.filters = [color_filter];

        //container for display Plane
        con = new DisplayObject3D();
        con.addChild(p);


        //Add plane container to scene
        scene.addChild(con);
        addChild(view);
        addChild(new FramerateDisplay());

        addEventListener(Event.ENTER_FRAME, loop);
        //addEventListener(Event.ENTER_FRAME, pixelCheck);

    }

    private function loop(e:Event):void
    {
        if(marker != null)
        {
            con.transform = FLARPVGeomUtils.convertFLARMatrixToPVMatrix(marker.transformMatrix);
        }
        lre.render();
    }

ビデオのピクセルにアクセスできないようです。プレーンと MovieClipMaterial を介してピクセルにアクセスしようとしましたが、うまくいきませんでした。

どんな助けでも大歓迎です!

アデプタス

4

2 に答える 2

1

はい、できます。

  1. 透明な背景ビデオを作成して透明な背景ビデオを作成するには、グリーン スクリーンの背景フッテージを使用し、Adobe Afters Effects、Premiere、Final Cut で緑色の背景を削除するか、エクスポートまたはレンダリング設定で RGB + アルファに変更してからエクスポートします。

  2. あなたのコードで;

    mat = new MovieMaterial(v, false, true);
    mat = new MovieMaterial(v, true, true);
    
于 2012-10-04T13:11:17.790 に答える
0

申し訳ありませんが、透明なビデオ形式はflv. いくつかのフォーマットが透明度情報を運ぶことができるためです。River FLV playerを使用してテストできます。

于 2012-10-05T12:29:25.207 に答える