如何准确过滤 RGB 值以实现色度键效果

2023-11-25

我刚刚读过this教程并尝试了这个例子。所以我从网上下载了一个视频来自己测试。我所要做的就是在 if 条件下调整 RGB 值

这是示例中的示例代码

computeFrame: function() {
    this.ctx1.drawImage(this.video, 0, 0, this.width, this.height);
    let frame = this.ctx1.getImageData(0, 0, this.width, this.height);
    let l = frame.data.length / 4;

    for (let i = 0; i < l; i++) {
      let r = frame.data[i * 4 + 0];
      let g = frame.data[i * 4 + 1];
      let b = frame.data[i * 4 + 2];
      if (g > 100 && r > 100 && b < 43)
        frame.data[i * 4 + 3] = 0;
    }
    this.ctx2.putImageData(frame, 0, 0);
    return;
  }

在教程示例中,它过滤掉黄色(我猜不是黄色)。我下载的示例视频使用绿色背景。所以我在 if 条件下调整了 rgb 值以获得期望的结果

经过多次尝试,我终于得到了这个。

enter image description here

现在我想知道的是如何在不猜测的情况下准确地过滤掉绿屏(或任何其他屏幕)。或者随机调整值。

光是猜测就需要几个小时才能完全正确。这只是一个真实应用程序的示例。也许需要更多。

注意:该示例目前在 Firefox 中运行。


您可能只需要一个更好的算法。这是一个,它并不完美,但你可以更容易地调整它。

just do it bro

基本上,您只需要一个颜色选择器,然后从视频中选择最亮和最暗的值(分别将 RGB 值放入 l_ 和 d_ 变量中)。如果需要,您可以稍微调整容差,但是通过使用颜色选择器选择不同区域来获得正确的 l_ 和 r_ 值将为您提供更好的关键点。

let l_r = 131,
    l_g = 190,
    l_b = 137,

    d_r = 74,
    d_g = 148,
    d_b = 100;

let tolerance = 0.05;

let processor = {
  timerCallback: function() {
    if (this.video.paused || this.video.ended) {
      return;
    }
    this.computeFrame();
    let self = this;
    setTimeout(function () {
        self.timerCallback();
      }, 0);
  },

  doLoad: function() {
    this.video = document.getElementById("video");
    this.c1 = document.getElementById("c1");
    this.ctx1 = this.c1.getContext("2d");
    this.c2 = document.getElementById("c2");
    this.ctx2 = this.c2.getContext("2d");
    let self = this;
    this.video.addEventListener("play", function() {
        self.width = self.video.videoWidth;
        self.height = self.video.videoHeight;
        self.timerCallback();
      }, false);
  },

  calculateDistance: function(c, min, max) {
      if(c < min) return min - c;
      if(c > max) return c - max;

      return 0;
  },

  computeFrame: function() {
    this.ctx1.drawImage(this.video, 0, 0, this.width, this.height);
    let frame = this.ctx1.getImageData(0, 0, this.width, this.height);
        let l = frame.data.length / 4;

    for (let i = 0; i < l; i++) {
      let _r = frame.data[i * 4 + 0];
      let _g = frame.data[i * 4 + 1];
      let _b = frame.data[i * 4 + 2];

      let difference = this.calculateDistance(_r, d_r, l_r) + 
                       this.calculateDistance(_g, d_g, l_g) +
                       this.calculateDistance(_b, d_b, l_b);
      difference /= (255 * 3); // convert to percent
      if (difference < tolerance)
        frame.data[i * 4 + 3] = 0;
    }
    this.ctx2.putImageData(frame, 0, 0);
    return;
  }
};
// :/ 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何准确过滤 RGB 值以实现色度键效果 的相关文章

随机推荐

  • 推送到 Github 时遇到问题,无法生成 sh:没有这样的文件或目录

    我在推送到 Github 时遇到了困难 我有一个克隆的存储库 并且我对其进行了更改 我想将其推送回 github 在存储库中时 我执行以下操作 git add 当我没有得到回应时 这似乎有效 然后当我这样做时 git commit m te
  • http.get 和 ISO-8859-1 编码响应

    我即将编写一个 RSS 提要获取器 但遇到了一些字符集问题 与编码相比 加载和解析提要非常容易 我正在加载提要http get我将每个数据事件的块放在一起 后来我用 npm lib 解析整个字符串feedparser它适用于给定的字符串 可
  • Gradle:如何在控制台实时显示测试结果?

    我想查看测试结果 system out err 来自正在测试的组件的日志消息 当他们奔跑时在我运行的同一个控制台中 gradle test 并且不要等到测试完成才查看测试报告 仅在测试完成时生成 因此我无法在测试运行时 tail f 任何内
  • 配置 Maven 以使用带有基本身份验证的 CXF wsdl2java

    我有一个应用程序需要与 SharePoint 的 Web 服务之一集成 该Web服务无法自由访问 需要身份验证 因此 当执行生成源阶段时 我的应用程序中的标准 wsdl2java Maven 插件会给出 HTTP 401 错误 有没有办法设
  • Microsoft Graph 401 未经访问令牌授权

    无法从 Microsoft Graph API 获取数据 private String getUserNamesFromGraph throws Exception String bearerToken Bearer getAccessTo
  • Rails 3.1 资产管道 - 为什么我的图像没有预编译用于生产?

    运行时 rake assets precompile all RAILS ENV production RAILS GROUPS assets 一切都预编译但不是我的 app assets images 我什至尝试将其添加到我的enviro
  • pip install-找不到满足要求的版本

    我正在尝试安装一个名为got使用点 但它一直显示 无法找到满足要求的版本 的错误 我在网上搜索了解决方案 有一些解释说尝试 pip freeze gt requirements txt 但它对我来说仍然是一个黑匣子 这里有什么问题以及我应该
  • Google BQ - 如何更新插入表中的现有数据?

    我正在使用 Python 客户端库在 BigQuery 表中加载数据 我需要更新这些表中的一些已更改的行 但我不知道如何正确更新它们 我想要一些类似的UPSERT功能 仅当行不存在时插入行 否则 更新现有行 在表中使用带有校验和的特殊字段
  • 如何从Python中的父文件夹导入函数?

    我需要在我的 python 项目上执行函数的导入 我知道有很多类似的问题 但是 不幸的是 我找不到适合我的解决方案 因为答案要么太具体 要么太笼统 要么它们只是丑陋的黑客 比如操作与绝对路径 我的文件夹结构如下所示 PythonClient
  • 到底是什么导致 Session_Start 被调用?

    在我正在构建的一个小演示应用程序中 我在 Global Session Start 事件中放置了用于初始化数据库的代码 但是 我注意到 当我在开发服务器上的调试器中运行应用程序时 此事件不会触发 尚未在其他地方进行测试 问题一 是什么赋予了
  • 用于存储矩阵的Java大数据结构

    我需要存储一个包含邮政编码以及每个邮政编码之间的距离 以公里为单位 的二维矩阵 我的客户有一个应用程序可以计算距离 然后将其存储在 Excel 文件中 目前有952个名额 所以矩阵将有 952x952 906304 个条目 我尝试将其映射到
  • CORS $.ajax 会话 cookie (access-control-allow-credentials & withCredentials=true)

    我意识到这个问题已经被问了十几次或更多次 给出的每个答复都表明我做得正确 但也许我遗漏了一些东西 AJAX 提供 CORS 请求 就像这样 ajax url someotherdomain com type post data key va
  • 组合谓词

    有什么方法可以组合谓词吗 可以说我有这样的东西 class MatchBeginning public binary function
  • EF4.3.1 中的 MaxLength 属性

    The type System ComponentModel DataAnnotations MaxLengthAttribute exists in both path packages EntityFramework 4 3 1 lib
  • 如何解决路径中的非法字符异常?

    我使用 XML 解析显示来自 URL 的图像 有些图像显示得很好 但有时我会遇到如下异常 索引 113 处的路径中存在非法字符 http www theblacksheeponline com party img thumbspps 123
  • 无法在java中实现A Star

    我一整天都在尝试让这个算法启动并运行 但我一辈子都做不到 我在网上阅读了很多教程 以及 AS3 javascript 和 C 的源代码 但我无法将我所看到的内容适应我自己的代码 我创建了一个 AStar 类 它有一个名为 Node 的嵌套类
  • 如何将命令行参数传递给嵌套脚本?

    注意 这不是将 args 发送到顶级脚本 而是发送到由that script 在我的 package json 中 当我调用直接采用命令行参数的脚本时 它可以工作 但是 当我调用一个调用其他脚本的脚本时 它不会将命令行参数传递给它 我该如何
  • 实例方法的示例? (爪哇)

    我仍在学习 Java 中的方法 并且想知道如何使用实例方法 我在想这样的事情 public void example String random 但是 我不确定这实际上是实例方法还是其他类型的方法 有人可以帮我吗 如果它不是静态方法 那么它
  • 使用 Xcode 5 和 Matlab R2013b 在 OS X 10.9 中编译 mexopencv

    我有兴趣使用Kota Yamaguchi 的 mexopencv 库在我的系统上具有以下规格 OS X 10 9 小牛队 Xcode 5 MATLAB 2013b OpenCV 通过 macports 安装到 opt local inclu
  • 如何准确过滤 RGB 值以实现色度键效果

    我刚刚读过this教程并尝试了这个例子 所以我从网上下载了一个视频来自己测试 我所要做的就是在 if 条件下调整 RGB 值 这是示例中的示例代码 computeFrame function this ctx1 drawImage this