【问题标题】:adding noise to a video in actionscript在动作脚本中为视频添加噪音
【发布时间】:2011-09-02 02:21:00
【问题描述】:

在我开始之前,如果我要问的问题被视为超级新手问题,我想道歉。

所以我尝试了 Lee Brimelow 的关于使用 actionscript3 创建简单 AR 场景的教程。 (http://blog.theflashblog.com/?p=901) 考虑到我以前从未使用 Adob​​e Flex Builder 创建过东西,结果非常好。 (我在看到那些教程后立即安装了 Flex Builder)

这里是源代码

package {

    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.media.Camera;
    import flash.media.Video;
    import flash.utils.ByteArray;

    import org.libspark.flartoolkit.core.FLARCode;
    import org.libspark.flartoolkit.core.param.FLARParam;
    import org.libspark.flartoolkit.core.raster.rgb.FLARRgbRaster_BitmapData;
    import org.libspark.flartoolkit.core.transmat.FLARTransMatResult;
    import org.libspark.flartoolkit.detector.FLARSingleMarkerDetector;
    import org.libspark.flartoolkit.support.pv3d.FLARBaseNode;
    import org.libspark.flartoolkit.support.pv3d.FLARCamera3D;
    import org.papervision3d.lights.PointLight3D;
    import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
    import org.papervision3d.materials.utils.MaterialsList;
    import org.papervision3d.objects.primitives.Cube;
    import org.papervision3d.render.BasicRenderEngine;
    import org.papervision3d.scenes.Scene3D;
    import org.papervision3d.view.Viewport3D;

    [SWF(width="640", height="480", frameRate="30", backgroundColor="#FFFFFF")]

    public class FLARdemo extends Sprite
    {
        [Embed(source="pat1.pat", mimeType="application/octet-stream")]
        private var pattern:Class;

        [Embed(source="camera_para.dat", mimeType="application/octet-stream")]
        private var params:Class;

        private var fparams:FLARParam;
        private var mpattern:FLARCode;
        private var vid:Video;
        private var cam:Camera;
        private var bmd:BitmapData;
        private var raster:FLARRgbRaster_BitmapData;
        private var detector:FLARSingleMarkerDetector;
        private var scene:Scene3D;
        private var camera:FLARCamera3D;
        private var container:FLARBaseNode;
        private var vp:Viewport3D;
        private var bre:BasicRenderEngine;
        private var trans:FLARTransMatResult;

        public function FLARdemo()
        {
            setupFLAR();
            setupCamera();
            setupBitmap();
            setupPV3D();
            addEventListener(Event.ENTER_FRAME, loop);
        }

        private function setupFLAR():void
        {
            fparams = new FLARParam();
            fparams.loadARParam(new params() as ByteArray);
            mpattern = new FLARCode(16, 16);
            mpattern.loadARPatt(new pattern());
        }

        private function setupCamera():void
        {
            vid = new Video(640, 480);
            cam = Camera.getCamera();
            cam.setMode(640, 480, 30);
            vid.attachCamera(cam);
            addChild(vid);
        }

        private function setupBitmap():void
        {
            bmd = new BitmapData(640, 480);
            bmd.draw(vid);
            raster = new FLARRgbRaster_BitmapData(bmd);
            detector = new FLARSingleMarkerDetector(fparams, mpattern, 80);
        }

        private function setupPV3D():void
        {
            scene = new Scene3D();
            camera = new FLARCamera3D(fparams);
            container = new FLARBaseNode();
            scene.addChild(container);

            var pl:PointLight3D = new PointLight3D();
            pl.x = 1000;
            pl.y = 1000;
            pl.z = -1000;

            var ml:MaterialsList = new MaterialsList({all: new FlatShadeMaterial(pl)});

            var Cube1:Cube = new Cube(ml, 30, 30, 30);                  
            var Cube2:Cube = new Cube(ml, 30, 30, 30);
            Cube2.z = 50
            var Cube3:Cube = new Cube(ml, 30, 30, 30);
            Cube3.z = 100

            container.addChild(Cube1);
            container.addChild(Cube2);
            container.addChild(Cube3);

            bre = new BasicRenderEngine();
            trans = new FLARTransMatResult();

            vp = new Viewport3D;
            addChild(vp);
        }

        private function loop(e:Event):void
        {
            bmd.draw(vid);

            try
            {
                if(detector.detectMarkerLite(raster, 80) && detector.getConfidence() > 0.5)
                {
                    detector.getTransformMatrix(trans);
                    container.setTransformMatrix(trans);
                    bre.renderScene(scene, camera, vp);
                }
            }
            catch(e:Error){}
        }
    }
}

我要问的是: 我们可以在最终的视频输出中添加一些噪音吗?我试图通过分别添加噪声来找出 PSNR。 我可以在噪声和视频之间做一些卷积吗?

哦,顺便说一句,我这样做是为了我的大学作业。我的教授希望我解释一下 FlarToolKit 的工作原理。 (详情如矩阵投影、通过迭代方法获取错误等)

谢谢。 普拉玛

【问题讨论】:

  • 感谢 Bartzilla 修复我的帖子!很抱歉成为一个完全的菜鸟。 :D

标签: actionscript-3 video augmented-reality noise flartoolkit


【解决方案1】:

动态创建细粒度噪声的计算成本很高,因此我会生成低分辨率噪声并将其放大。在您的项目中,只需在 addEventListener 调用之后添加位图设置代码,然后添加单行以在您的活动循环中生成噪声。

package 
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.BlendMode;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.geom.Matrix;
    import flash.media.Camera;
    import flash.media.Video;
    import flash.utils.getTimer;

    public class NoiseMain extends Sprite
    {
        protected static const VID_WIDTH : uint = 640;
        protected static const VID_HEIGHT : uint = 480;

        protected static const NOISE_SCALE_X : Number = 4;
        protected static const NOISE_SCALE_Y : Number = 2;

        protected var _vid : Video;
        protected var _noise : BitmapData;
        protected var _composite : BitmapData;
        protected var _matrix : Matrix;

        public function NoiseMain()
        {
            // We're creating a webcam outlet, but not adding it to the stage since we want to post-process the image.
            _vid = new Video(VID_WIDTH, VID_HEIGHT);
            var cam : Camera = Camera.getCamera();
            cam.setMode(VID_WIDTH, VID_HEIGHT, 30);
            _vid.attachCamera(cam);     

            var w : uint = Math.ceil(VID_WIDTH / NOISE_SCALE_X);
            var h : uint = Math.ceil(VID_HEIGHT / NOISE_SCALE_Y);

            _noise = new BitmapData(w, h, false, 0xFFFFFF);
            _composite = new BitmapData(VID_WIDTH, VID_HEIGHT, false, 0x000000);
            var bmp : Bitmap = new Bitmap(_composite);
            addChild(bmp);

            _matrix = new Matrix(NOISE_SCALE_X, 0, 0, NOISE_SCALE_Y);

            stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
        }

        protected function enterFrameHandler(evt : Event) : void
        {
            _noise.noise(getTimer(), 204, 255, 7, true);
            _composite.lock();
            _composite.draw(_vid);
            _composite.draw(_noise, _matrix, null, BlendMode.MULTIPLY); 
            _composite.unlock();        
        }
    }
}

编辑:我已经修改了我的示例,使其更符合您想要做的事情。您可以调整噪声比例常数以更改噪声的“纹理”,以及通过更改 BlendMode 来弄乱噪声的强度(noise() 方法的第二个和第三个参数)和噪声的视觉外观在第二次 draw() 调用中)。

【讨论】:

  • 约书亚,非常感谢。我要试试你的代码。如果我有麻烦,我会回来找你的。再次感谢! :)
  • Joshua.. 噪音效果很好。谢谢你。但我担心我一直在解释错误:你看,我想要的是,当相机启动时会出现噪音 - 而不是在程序运行后(计算、转换、渲染 3d 对象等)。如果在相机启动后出现噪音,希望我能找出我的程序可以容忍的噪音限制(通过增加或减少噪音)。因为我的主要目的是我想计算我的程序的 PSNR。我很抱歉约书亚造成了误解。你能帮助我吗? :( 非常感谢您的帮助。Danke。
  • 我已经更新了我的代码示例,使其与您正在做的事情更加相关。
  • 再一次,非常感谢你,Joshua.. 但它仍然没有说明我的意思..(我很抱歉 Joshua 没有正确解释它..)噪音仍然出现在程序的结束。我想做的是:在程序开始时相机启动时发出噪音。因此,由相机捕获的图像(然后图像将由程序计算和处理)会被我们制造的噪音扭曲。FLARToolKit 是否有能力做这样的工作?再次感谢约书亚。太感谢了。再说一遍:如果我有这么多问题打扰您,我深表歉意。
  • 对不起,我没有解释清楚,我的例子会照顾你想要做的......只需将bmd.draw(vid)替换为bmd.draw(_composite)(将我的enterFrameHandler的内容放入draw() 操作之前的函数)。或者,您可以简单地使用 FLAR 注册 _composite 而不是 bmd。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多