iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >canvas像素点操作之视频绿幕抠图的示例分析
  • 393
分享到

canvas像素点操作之视频绿幕抠图的示例分析

2023-06-09 13:06:39 393人浏览 泡泡鱼
摘要

这篇文章将为大家详细讲解有关canvas像素点操作之视频绿幕抠图的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 本文介绍了canvas像素点操作之视频绿幕抠图,分享给大家,具体如下:用

这篇文章将为大家详细讲解有关canvas像素点操作之视频绿幕抠图的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

 本文介绍了canvas像素点操作之视频绿幕抠图,分享给大家,具体如下:

用法:

context.putImageData(imgData, x, y, dX, dY, dWidth, dHeight);
 
参数描述
imgData规定要放回画布的 ImageData 对象。
xImageData 对象左上角的 x 坐标,以像素计。
yImageData 对象左上角的 y 坐标,以像素计。
dX可选。水平值(x),以像素计,在画布上放置图像的位置。
dY可选。水平值(y),以像素计,在画布上放置图像的位置。
dWidth可选。在画布上绘制图像所使用的宽度。
dHeight可选。在画布上绘制图像所使用的高度。

下面的栗子简单实现了几个简单的滤镜效果,具体算法参考的这里,学过《数字图像处理》的同学应该对此理解更深刻。

demo

canvas像素点操作之视频绿幕抠图的示例分析

该栗子纯属为了演示功能而做,如果只强调效果而不在乎数据的话,用css3的filter属性便能高效又轻松地搞定。

部分代码

import imgUrl from './component/sample.jpg';export default {data () {return {imgUrl: imgUrl}},methods: {onOperate1 () {this.ctx.putImageData(this.onCompute1(), 0, 0);},onOperate2 () {this.ctx.putImageData(this.onCompute2(), 0, 0);},...onCancel () {this.reload();},onCompute1 () {let data = this.frameData.data;        for (let i = 0; i < this.imgDataLength; i += 4) {          let r = data[i + 0],          g = data[i + 1],          b = data[i + 2];                    data[i + 0] = 255 - r;          data[i + 1] = 255 - g;          data[i + 2] = 255 - b;        }        return this.frameData;},onCompute2 () {let data = this.frameData.data;        for (let i = 0; i < this.imgDataLength; i += 4) {          data[i] = Math.abs(data[i + 1] - data[i + 2] + data[i + 1] + data[i]) * data[i] / 256;              data[i + 1] = Math.abs(data[i + 2] - data[i + 1] + data[i + 2] + data[i]) * data[i] / 256;              data[i + 2] = Math.abs(data[i + 2] - data[i + 1] + data[i + 2] + data[i]) * data[i + 1] / 256;        }        return this.frameData;},...},mounted () {        this.canvas = this.$refs['canvas'];        this.ctx = this.canvas.getContext('2d');        this.reload();}}

上周跟同学去了一趟溧阳天目湖的南山竹海,在景区被忽悠拍了一张照片,就是这张 &mdash;&mdash;

canvas像素点操作之视频绿幕抠图的示例分析

然后被朋友圈吐槽抠图。其实当时就是站在一块绿幕前拍的:joy: 。

PS中魔法棒工具可以把图片中一定容差下的相近像素都选中、清空,轻松做到一键“抠图”,前提是主体一定要与背景有大的差异,即像素值差值越大,抠图效果越好。

Canvas同样可以做到,并且可以处理视频帧,其中的原理是一样的 &mdash;&mdash; 将每个视频帧中绿幕的像素块透明度置0即可。像这样 &mdash;&mdash;

demo

canvas像素点操作之视频绿幕抠图的示例分析

部分代码

import videoUrl from './component/video.ogv';import imgUrl from './component/sample.jpg';const TOLERANCE = 5;export default {data () {return {videoUrl: videoUrl,imgUrl: imgUrl}},methods: {draw () {if (this.video.paused || this.video.ended) {          return;        }this.ctx.drawImage(this.video, 0, 0, this.width, this.height);this.ctx.putImageData(this.cutOut(), 0, 0);},cutOut () {let frameData = this.ctx.getImageData(0, 0, this.width, this.height),len = frameData.data.length / 4;        for (let i = 0; i < len; i++) {          let r = frameData.data[i * 4 + 0],          g = frameData.data[i * 4 + 1],          b = frameData.data[i * 4 + 2];          if (r - 100 >= TOLERANCE            && g - 100 >= TOLERANCE            && b - 43 <= TOLERANCE) {            frameData.data[i * 4 + 3] = 0;          }        }        return frameData;}},mounted () {this.video = this.$refs['video'];        this.canvas = this.$refs['canvas'];        this.ctx = this.canvas.getContext('2d');        this.timer = null;        this.video.addEventListener('play', () => {            this.width = this.video.videoWidth;            this.height = this.video.videoHeight;            this.timer && clearInterval(this.timer);            this.timer = setInterval(() => {            this.draw();            }, 50);        }, false);}}

关于“canvas像素点操作之视频绿幕抠图的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: canvas像素点操作之视频绿幕抠图的示例分析

本文链接: https://www.lsjlt.com/news/256221.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • canvas像素点操作之视频绿幕抠图的示例分析
    这篇文章将为大家详细讲解有关canvas像素点操作之视频绿幕抠图的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 本文介绍了canvas像素点操作之视频绿幕抠图,分享给大家,具体如下:用...
    99+
    2023-06-09
  • HTML5 Canvas像素操作的示例分析
    这篇文章给大家分享的是有关HTML5 Canvas像素操作的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 注意 由于人们可以直接操纵像素数据,因此出现了某些人利用从C...
    99+
    2024-04-02
  • python opencv图像处理基本操作的示例分析
    本篇文章给大家分享的是有关python opencv图像处理基本操作的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。①读取图像②显示图像该函数中,name是显示窗口的名...
    99+
    2023-06-25
  • JS之页面加载事件、数组操作、DOM节点操作、循环和分支的示例分析
    这篇文章主要介绍JS之页面加载事件、数组操作、DOM节点操作、循环和分支的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体如下:页面加载事件的比较window.onload...
    99+
    2024-04-02
  • JQuery中Ajax异步操作之动态添加节点功能的示例分析
    小编给大家分享一下JQuery中Ajax异步操作之动态添加节点功能的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!异步操...
    99+
    2024-04-02
  • 微信小程序手势操作之单触摸点与多触摸点的示例分析
    这篇文章给大家分享的是有关微信小程序手势操作之单触摸点与多触摸点的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Demo 为了研究小程序是否支持多手指,需要使用touch...
    99+
    2024-04-02
  • 事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流的示例分析
    这篇文章主要介绍事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、事件冒泡定义事件冒泡是指在一个对象触发某类...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作