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

时间:2010-08-01 09:12:05

标签: flash actionscript camera

我查了一下文件:

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

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

动作是否可以完成这项工作?

2 个答案:

答案 0 :(得分:1)

你无法改变实际的相机数据(它和我正在进一步描述的内容之间存在差异),但是可以在将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的公然广告如下:-) {/ 1}}在Haxe中是Float在ActionScript 3中,而Haxe使用类型推断,这使得可以省略变量类型随意,让Haxe自己弄明白(当你添加两个Number时你会得到什么?在Flash平台上,你总是得到一个int。)AS3也没有这个概念内联(但是?)所以你必须简单地从代码中删除int语法,这就是全部。

答案 1 :(得分:0)

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

对于其他所有内容,您可以使用上面建议的方法,取出凸轮,将其推入NetConnection实例Video,然后使用video.attachCamera应用您想要的效果。如果你想让像素变暗,你可以使用video.filters = [myFilter]对象的draw属性将摄像机图像从视频绘制到位图上进行操作,但是你必须在BitmapDataenterFrame以使bitmapData保持同步。

Timer

希望这是有帮助的