使用canvas截取web camera指定区域,并生成图片

server/2024/10/18 3:03:50/

目标,截取红色色块背后的视频区域。
在这里插入图片描述
代码结构如下:

<div id="p1"><video id="v1" autoplay playsinline></video><div id="mrz"></div><canvas id="captureCanvas"></canvas>
</div>
<button id="screenshot-btn">截图</button>
<img id="screenshot" src="" alt="screenshot">

核心代码是确定截取坐标及大小。

// 定义截图函数
async function takeScreenshot() {// 获取视频元素const video = document.getElementById('v1');// 获取 mrz 区域的位置和尺寸const mrzRect = document.getElementById('mrz').getBoundingClientRect();const mrzWidth = mrzRect.width;const mrzHeight = mrzRect.height;// 设置 canvas 大小为 mrz 区域的大小const canvas = document.getElementById('captureCanvas');canvas.width = mrzWidth;canvas.height = mrzHeight;// 获取 canvas 的 2D 上下文const ctx = canvas.getContext('2d');// 清除 canvasctx.clearRect(0, 0, canvas.width, canvas.height);// 获取视频元素的位置const videoRect = video.getBoundingClientRect();// 获取 mrz 区域相对于视频的位置const mrzX = mrzRect.left - videoRect.left;const mrzY = mrzRect.top - videoRect.top;// 计算视频流的像素比例const videoScaleX = videoRect.width / video.videoWidth;const videoScaleY = videoRect.height / video.videoHeight;// 计算原始视频坐标const originalMrzX = Math.round(mrzX / videoScaleX);const originalMrzY = Math.round(mrzY / videoScaleY);// 确保原始坐标正确const finalMrzX = Math.max(0, originalMrzX);const finalMrzY = Math.max(0, originalMrzY);// 使用 drawImage 方法绘制指定区域到 canvas 上ctx.drawImage(video,finalMrzX, finalMrzY, // 源图像的起始坐标mrzWidth / videoScaleX, mrzHeight / videoScaleY, // 源图像的宽度和高度0, 0, // 目标图像的起始坐标mrzWidth, mrzHeight // 目标图像的宽度和高度);// 生成图片const dataUrl = canvas.toDataURL();document.getElementById('screenshot').src = dataUrl;
}

最关键的就是这段代码:

// 使用 drawImage 方法绘制指定区域到 canvas 上ctx.drawImage(video,finalMrzX, finalMrzY, // 源图像的起始坐标mrzWidth / videoScaleX, mrzHeight / videoScaleY, // 源图像的宽度和高度0, 0, // 目标图像的起始坐标mrzWidth, mrzHeight // 目标图像的宽度和高度);

实际应用的时候可能截取的区域不是很准确,有偏差,这时候可以通过调整起始坐标位置和源图像的宽高,来调整截图区域,使截出来的图片更准确。


http://www.ppmy.cn/server/125267.html

相关文章

《面向对象是怎样工作的》笔记

6、1、在面向对象的世界中&#xff0c;我们需要事先为所有的行动准备好方法并通过消息传递来调用方法&#xff0c;这样事物才会开始运作。 2、实际上&#xff0c;类、继承和多态应该被明确定义为能提高软件的可维护性和可重用行的结构。类将变量和子程序汇总在一起&#xff0c…

GESP等级考试C++二级-数学函数

C的cmath库中有丰富的数学函数&#xff0c;通过这些函数可以进行相应的数学计算。 1 cmath库的导入 通过import指令导入cmath库&#xff0c;代码如图1所示。 图1 导入cmath库的代码 2 abs()函数 abs()函数用来获取指定数的绝对值&#xff0c;代码如图2所示。 图2 abs()函数…

RealSense、ZED 和奥比中光Astra几款主流相机介绍及应用

以下是英特尔 RealSense、Stereolabs ZED 和奥比中光Astra几款相机的详细对比&#xff0c;包括参数、性能以及二次开发等支持&#xff0c;附带代码示例。 详细信息对比和二次开发示例 1. 英特尔 RealSense (例如 D435/D455) 深度技术&#xff1a;立体视觉 红外投影分辨率&a…

react crash course 2024(9) proxying

在 proxy:{/api:{target:"http://localhost:8000",changeOrigin:true,rewrite:(path) > path.replace(/^\/api/,)}}

unity CustomEditor的基本使用

CustomEditor用来自定义脚本的编辑面板 其基本使用方式 先准备一个类&#xff0c;继承MonoBehaviour 定义一个变量&#xff0c;然后准备一个类&#xff0c;继承自Editor 在CustomEditor中指定要去修改的类型&#xff0c;通过serializedObject.FindProperty(变量名)的方式来获…

滚雪球学MySQL[2.1讲]:基础SQL操作

全文目录&#xff1a; 前言2. 基础SQL操作2.1 数据库与表的基本操作创建与删除数据库创建、修改与删除表数据类型详解 2.2 基本数据操作插入数据&#xff08;INSERT&#xff09;查询数据&#xff08;SELECT&#xff09;更新数据&#xff08;UPDATE&#xff09;删除数据&#xf…

Pygame中Sprite实现逃亡游戏5

在《Pygame中Sprite实现逃亡游戏4》中通过碰撞检测实现了玩家、飞龙与飞火之间的碰撞处理&#xff0c;基本上实现了逃亡功能。最后&#xff0c;实现这个逃亡游戏中文字提示的功能。 1 操作提示 当进入游戏后&#xff0c;会在玩家下方的位置给出操作提示&#xff0c;如图1所示…

实战OpenCV之图像滤波

基础入门 图像滤波是数字图像处理中一种非常重要的技术,主要用于图像噪声去除、图像平滑、突出图像特征,或者进行图像风格的转换。它通过数学运算对图像中的像素值进行修改,以达到特定的处理目的。图像滤波可以分为两大类,分别为:线性滤波、非线性滤波。 线性滤波器通过一…