如何使用Camera类控制视觉效果?

问题描述 投票:0回答:2

我检查了文件:

http://help.adobe.com/en_US/AS3LCR/Flash_10.0/flash/media/Camera.html

但仍然没有找到如何控制我的电脑摄像头的视觉效果(如亮度,饱和度等)的信息。

动作脚本可以完成这种工作吗?

flash actionscript camera
2个回答
1
投票

你无法改变实际的Camera数据(这与我正在进一步描述的数据之间存在差异),但在将Camera对象附加到Video对象并使用各种转换过滤器之后,可以轻松地执行您想要的操作。来自其他原生ActionScript类的例程,如ColorTransformDisplayObject.transform.colorTransformDisplayObject.filters,以改变屏幕/内存上显示的内容,我相信,这可能是你想要的。

为了给您一个真实世界的使用示例,您可以使用以下代码调整视频中显示的摄像机数据的饱和度:

/// Desaturate displayed image completely
video.filters = [ new ColorMatrixFilter(saturation_filter_matrix(0)) ];

我将方法定义为:

static inline var RWGT = 0.3086;
static inline var GWGT = 0.6094;
static inline var BWGT = 0.0820;

static public function brightness_filter_matrix(b: Float)
{
    return [    b, 0, 0, 0, 0,
                0, b, 0, 0, 0,
                0, 0, b, 0, 0,
                0, 0, 0, 1, 0 ];
}

static public function saturation_filter_matrix(s: Float)
{
    var b = (1 - s) * RWGT;
    var a = b + s;
    var d = (1 - s) * GWGT;
    var e = d + s;
    var g = (1 - s) * BWGT;
    var i = g + s;

    return [    a, d, g, 0, 0,
                b, e, g, 0, 0,
                b, d, i, 0, 0,
                0, 0, 0, 1, 0 ];
}

static public function contrast_filter_matrix(v: Float)
{
    v += 1;

    var r = v;
    var g = v;
    var b = v;

    return [    r, 0, 0, 0, 128 * (1 - r),
                0, g, 0, 0, 128 * (1 - g),
                0, 0, b, 0, 128 * (1 - b),
                0, 0, 0, 1, 0 ];
}

我也认为transform.colorTransform在做同样的工作时可能会更有效率,不知怎的,我发现过滤器往往会对Adobe Flash Player中等到高度征税,所以请注意。

您无法更改实际摄像头输入这一事实的含义是,当您通过网络(例如Flash Media Server)发布摄像头时,无论您使用什么效果在您自己的视频对象中显示数据,派对都会播放流将看到原始未更改的数据。 “解决方法”是向接收方宣布您希望它们应用于正在播放流的视频对象的确切参数。假设他们以与您显示的摄像机图像相同的方式应用这些参数,他们将以您看到的方式看到您的摄像机图像。

注意:代码是用Haxe编写的,但这两种语言非常相似。你需要注意的变化是(Haxe的公然广告如下:-) haxe中的Float例如是ActionScript 3中的Number,而Haxe使用类型推断使得可以随意省略变量类型,让Haxe弄明白本身(当你添加两个int时你会得到什么?在Flash平台上,你总是得到一个int。)AS3也没有内联的概念(但是?)所以你必须简单地从代码中删除inline语法,就这样。


0
投票

为了回应你关于直接访问摄像机数据的评论,我能想到的唯一一个问题就是你要录制到FMS(闪存介质服务器,Red5,wowza等),在这种情况下,数据来了直接从相机进入网络流(netStream.attachCamera(cam))。为此,没有直接的解决方法,您可以在发布/流式传输视频时将亮度和对比度设置(来自滤镜效果)存储为flv元数据,但是另一端的人必须解码此元数据(即使用Flash组件或可以解码AMF数据的东西进行播放,为此请参阅setDataFrameNetConnection方法

对于其他一切,您可以使用上面建议的方法,拿起凸轮,用Video将其推入video.attachCamera实例,然后使用video.filters = [myFilter]应用您想要的效果。如果你想使用像素来降低和肮脏,你可以使用draw对象的BitmapData属性将视频中的相机图像绘制到位图上进行操作,但是你必须在enterFrameTimer上执行此操作以保持bitmapData为同步。

var video:Video = new Video(w,h);
video.attachCamera(Camera.getCamera());
var bmd:BitmapData = new BitmapData(w,h);
bmd.draw(video);

希望这是有帮助的

© www.soinside.com 2019 - 2024. All rights reserved.