首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用FLARToolkit以编程方式ChromaKeying视频

使用FLARToolkit以编程方式ChromaKeying视频
EN

Stack Overflow用户
提问于 2012-08-28 02:53:47
回答 2查看 519关注 0票数 0

所以这可能会有点傻,也许...我正在尝试使用名为FLARToolkit的闪存插件在增强现实中播放视频剪辑。我有一个绿屏视频,我需要在飞机上播放这个视频。我目前正在使用MovieClipMaterial将视频放置在显示平面上。我想要遍历显示平面中的像素,并更改与绿色屏幕中的绿色匹配的像素,并将这些像素设置为透明、色度键控。也许有一种更有效的方法来做到这一点,我对建议持开放态度。

我也研究过ColorMatrixFilters,但我还没能设计出一种方法来使它具有选择性,而不是过滤掉视频中所有的绿色。

下面是我现在的代码:

代码语言:javascript
复制
[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访问像素,但没有成功。

任何帮助都将不胜感激!

Adeptatus

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-04 21:11:18

是的,你可以这样做;

  1. 创建透明背景视频要创建透明背景视频,请使用绿色屏幕背景素材,删除Adobe Afters Effects或Premiere或Final Cut上的绿色背景。在导出或渲染设置中更改为RGB + Alpha,然后在代码中导出

mat =新MovieMaterial(v,false,true);mat =新MovieMaterial(v,true,true);

票数 1
EN

Stack Overflow用户

发布于 2012-10-05 20:29:25

对不起,我忘了,透明的视频格式应该是flv。因为一些格式可以携带透明信息。可以使用River FLV player进行测试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12147827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档