【问题标题】:Comparing bitmap data in AS3 pixel for pixel逐个像素比较 AS3 中的位图数据
【发布时间】:2010-03-30 10:09:17
【问题描述】:

我正在寻找一种在 AS3 中相当简单的图像比较方法。我从网络摄像头(没有主题)拍摄了一张图像,将其传递给位图数据,然后拍摄了第二张图像(这次有一个主题)来比较这些数据,我想从这两张图像中创建一个蒙版来自两个位图上匹配的像素。我一直在摸不着头脑,我并没有真正取得任何进展。任何人都可以为我指出像素比较方法的正确方向,例如 getPixel32()

干杯

乔诺

【问题讨论】:

    标签: apache-flex flash actionscript-3 bitmapdata


    【解决方案1】:

    使用compare 区分两者,然后使用treshold 提取您感兴趣的部分。

    edit: 实际上它非常简单。诀窍是使用 mask 参数对每个通道多次应用阈值(否则比较几乎没有意义,因为0x010000(几乎是黑色)被认为大于0x0000FF(除了黑色之外))。方法如下:

    var dif:BitmapData;//your original bitmapdata
    var mask:BitmapData = new BitmapData(dif.width, dif.height, true, 0);
    const threshold:uint = 0x20;
    for (var i:int = 0; i < 3; i++) 
        mask.threshold(dif, dif.rect, new Point(), ">", threshold << (i * 8), 0xFF000000, 0xFF << (i * 8));
    

    这将创建一个透明蒙版。然后将阈值应用于所有三个通道,将 Alpha 通道设置为完全不透明,其中通道值超过阈值(您可能想要降低它)。

    您可以通过copying the alpha channel 将前景对象(“网络摄像头前的那个人”)从蒙版中隔离到当前视频图像。

    【讨论】:

    • 使用 compare() 方法会返回一些非常奇怪的结果(很多不同的颜色),然后阈值确实会删除位图的一部分,但似乎很不稳定......你能不能成为一个传奇人物?稍微详细说明阈值
    • @Jono:我想,但我不完全明白你想做什么。 “创建面具”是什么意思?你解释得越好,你就越有可能得到满意的答案;)
    • 对不起,我可能有点含糊。 :) 所以你在你的电脑前(带有网络摄像头) 移出网络摄像头 POV(拍摄快照)保存为位图数据然后位图。然后回到网络摄像头的 POV 前面(再拿一个)保存为位图数据然后位图。使用比较/阈值计算位图数据之间的差异。这有望创建一个掩码来掩盖实时网络摄像头馈送,这将每两帧更新一次以降低处理水平。如此有效,它是一个实时背景替换工具...有帮助吗?如果您想查看我的代码或更详细信息,请告诉我:)
    • 干得好伙计,现在正在用煤气做饭。非常感谢!现在我需要弄清楚的是将原始位图数据转换为真正的黑色!
    【解决方案2】:

    这里的一个问题是你想找出一个像素是否有任何变化,如果有,那么将该像素转换为另一种颜色(用于遮罩)。不幸的是,网络摄像头的质量不是很好,因此即使您的场景完全没有变化,来自网络摄像头的位图数据也会略有变化。因此,当您的拍摄对象进入画面时……您将获得拍摄对象的像素变化……但由于光照变化或相机质量,其他区域也会出现噪点。您需要做的是编写一个函数,该函数分析 bitmapdaya.compare() 的结果,以确定是否有足够的变化来保证实际对象的存在。这将有助于消除噪音并使您的面罩更准确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      • 2014-02-14
      • 2016-08-08
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      相关资源
      最近更新 更多