iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Web技术如何实现移动监测
  • 970
分享到

Web技术如何实现移动监测

2024-04-02 19:04:59 970人浏览 泡泡鱼
摘要

这篇文章主要介绍了WEB技术如何实现移动监测,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Web技术实现移动监测的介绍由上述引用语句可得出“

这篇文章主要介绍了WEB技术如何实现移动监测,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

Web技术实现移动监测的介绍

由上述引用语句可得出“移动监测”需要以下要素:

一个拥有摄像头的计算机用于判断移动的算法移动后的处理

注:本文涉及的所有案例均基于 PC/Mac 较新版本的 Chrome / Firefox 浏览器,部分案例需配合摄像头完成,所有截图均保存在本地。

对方不想和你说话,并向你扔来一个链接:

体验链接>>

Web技术如何实现移动监测
综合案例

该案例有以下两个功能:

拍好 POST 后的 1 秒会进行拍照静止 1 秒后音乐会停止,产生移动会恢复播放状态

上述案例也许并不能直接体现出『移动监测』的实际效果和原理,下面再看看这个案例。

体验链接>>

Web技术如何实现移动监测
像素差异

案例的左侧是视频源,而右侧则是移动后的像素处理(像素化、判断移动和只保留绿色等)。

因为是基于 Web 技术,所以视频源采用 WebRTC,像素处理则采用 canvas

视频源

不依赖 Flash 或 Silverlight,我们使用 WebRTC (Web Real-Time Communications) 中的 navigator.getUserMedia() api,该 API 允许 Web 应用获取用户的摄像头与麦克风流(stream)。

示例代码如下:

<!-- 若不加 autoplay,则会停留在第一帧 -->
<video id="video" autoplay></video>
// 具体参数含义可看相关文档。
const constraints = {
 audio: false,
 video: {
 width: 640,
 height: 480
 }
}
navigator.mediaDevices.getUserMedia(constraints)
 .then(stream => {
 // 将视频源展示在 video 中
 video.srcObject = stream
 })
 .catch(err => {
 console.log(err)
 })

对于兼容性问题,Safari 11 开始支持 WebRTC 了。具体可查看 caniuse。

像素处理

在得到视频源后,我们就有了判断物体是否移动的素材。当然,这里并没有采用什么高深的识别算法,只是利用连续两帧截图的像素差异来判断物体是否发生移动(严格来说,是画面的变化)。

截图

获取视频源截图的示例代码:

const video = document.getElementById('video')
const canvas = document.createElement('canvas')
const ctx = canvas.getContext('2d')
canvas.width = 640
canvas.height = 480
// 获取视频中的一帧
function capture () {
 ctx.drawImage(video, 0, 0, canvas.width, canvas.height)
 // ...其它操作
}

得出截图间的差异

对于两张图的像素差异,在 凹凸实验室 的 《“等一下,我碰!”——常见的2D碰撞检测》 这篇博文中所提及的“像素检测”碰撞算法是解决办法之一。该算法是通过遍历两个离屏画布(offscreen canvas)同一位置的像素点的透明度是否同时大于 0,来判断碰撞与否。当然,这里要改为『同一位置的像素点是否不同(或差异小于某阈值)』来判断移动与否。

但上述方式稍显麻烦和低效,这里我们采用 ctx.globalCompositeOperation = 'difference' 指定画布新增元素(即第二张截图与第一张截图)的合成方式,得出两张截图的差异部分。

体验链接>>

示例代码:

function diffTwoImage () {
 // 设置新增元素的合成方式
 ctx.globalCompositeOperation = 'difference'
 
 // 清除画布
 ctx.clearRect(0, 0, canvas.width, canvas.height)
 
 // 假设两张图像尺寸相等
 ctx.drawImage(firstImg, 0, 0)
 ctx.drawImage(secondImg, 0, 0)
}

Web技术如何实现移动监测
两张图的差异

体验上述案例后,是否有种当年玩“QQ游戏《大家来找茬》”的感觉。另外,这个案例可能还适用于以下两种情况:

  1. 当你不知道设计师前后两次给你的设计稿有何差异时

  2. 想查看两个浏览器对同一个网页的渲染有何差异时何时为一个“动作”

由上述“两张图像差异”的案例中可得:黑色代表该位置上的像素未发生改变,而像素越明亮则代表该点的“动作”越大。因此,当连续两帧截图合成后有明亮的像素存在时,即为一个“动作”的产生。但为了让程序不那么“敏感”,我们可以设定一个阈值。当明亮像素的个数大于该阈值时,才认为产生了一个“动作”。当然,我们也可以剔除“不足够明亮”的像素,以尽可能避免外界环境(如灯光等)的影响。

想要获取 Canvas 的像素信息,需要通过 ctx.getImageData(sx, sy, sw, sh),该 API 会返回你所指定画布区域的像素对象。该对象包含 datawidthheight。其中 data 是一个含有每个像素点 RGBA 信息的一维数组,如下图所示。

Web技术如何实现移动监测
含有 RGBA 信息的一维数组

获取到特定区域的像素后,我们就能对每个像素进行处理(如各种滤镜效果)。处理完后,则可通过 ctx.putImageData() 将其渲染在指定的 Canvas 上。

扩展:由于 Canvas 目前没有提供“历史记录”的功能,如需实现“返回上一步”操作,则可通过 getImageData 保存上一步操作,当需要时则可通过 putImageData 进行复原。

示例代码:

let imageScore = 0
const rgba = imageData.data
for (let i = 0; i < rgba.length; i += 4) {
 const r = rgba[i] / 3
 const g = rgba[i + 1] / 3
 const b = rgba[i + 2] / 3
 
 const pixelScore = r + g + b
 
 // 如果该像素足够明亮
 if (pixelScore >= PIXEL_SCORE_THRESHOLD) {
 imageScore++
 }
}
// 如果明亮的像素数量满足一定条件
if (imageScore >= IMAGE_SCORE_THRESHOLD) {
 // 产生了移动
}

在上述案例中,你也许会注意到画面是『绿色』的。其实,我们只需将每个像素的红和蓝设置为 0,即将 RGBA 的 r = 0; b = 0 即可。这样就会像电影的某些镜头一样,增加了科技感和神秘感。

体验地址>>

const rgba = imageData.data
for (let i = 0; i < rgba.length; i += 4) {
 rgba[i] = 0 // red
 rgba[i + 2] = 0 // blue
}
ctx.putImageData(imageData, 0, 0)

Web技术如何实现移动监测
将 RGBA 中的 R 和 B 置为 0

跟踪“移动物体”

有了明亮的像素后,我们就要找出其 x 坐标的最小值与 y 坐标的最小值,以表示跟踪矩形的左上角。同理,x 坐标的最大值与 y 坐标的最大值则表示跟踪矩形的右下角。至此,我们就能绘制出一个能包围所有明亮像素的矩形,从而实现跟踪移动物体的效果。

Web技术如何实现移动监测
找出跟踪矩形的左上角和右下角

体验链接>>

示例代码:

function processDiff (imageData) {
 const rgba = imageData.data
 
 let score = 0
 let pixelScore = 0
 let motionBox = 0
 
 // 遍历整个 canvas 的像素,以找出明亮的点
 for (let i = 0; i < rgba.length; i += 4) {
 pixelScore = (rgba[i] + rgba[i+1] + rgba[i+2]) / 3
 
 // 若该像素足够明亮
 if (pixelScore >= 80) {
 score++
 
 coord = calcCoord(i)
 motionBox = calcMotionBox(montionBox, coord.x, coord.y)
 }
 }
 
 return {
 score,
 motionBox
 }
}
// 得到左上角和右下角两个坐标值
function calcMotionBox (curMotionBox, x, y) {
 const motionBox = curMotionBox || {
 x: { min: coord.x, max: x },
 y: { min: coord.y, max: y }
 }
 motionBox.x.min = Math.min(motionBox.x.min, x)
 motionBox.x.max = Math.max(motionBox.x.max, x)
 motionBox.y.min = Math.min(motionBox.y.min, y)
 motionBox.y.max = Math.max(motionBox.y.max, y)
 return motionBox
}
// imageData.data 是一个含有每个像素点 rgba 信息的一维数组。
// 该函数是将上述一维数组的任意下标转为 (x,y) 二维坐标。
function calcCoord(i) {
 return {
 x: (i / 4) % diffWidth,
 y: Math.floor((i / 4) / diffWidth)
 }
}

在得到跟踪矩形的左上角和右下角的坐标值后,通过 ctx.strokeRect(x, y, width, height) API 绘制出矩形即可。

ctx.lineWidth = 6
ctx.strokeRect(
 diff.motionBox.x.min + 0.5,
 diff.motionBox.y.min + 0.5,
 diff.motionBox.x.max - diff.motionBox.x.min,
 diff.motionBox.y.max - diff.motionBox.y.min
)

Web技术如何实现移动监测
这是理想效果,实际效果请打开 体验链接

扩展:为什么上述绘制矩形的代码中的 x、y 要加 0.5 呢?一图胜千言:
Web技术如何实现移动监测

性能缩小尺寸

在上一个章节提到,我们需要通过对 Canvas 每个像素进行处理,假设 Canvas 的宽为 640,高为 480,那么就需要遍历 640 * 480 = 307200 个像素。而在监测效果可接受的前提下,我们可以将需要进行像素处理的 Canvas 缩小尺寸,如缩小 10 倍。这样需要遍历的像素数量就降低 100 倍,从而提升性能。

体验地址>>

示例代码:

const motionCanvas // 展示给用户看
const backgroundCanvas // offscreen canvas 背后处理数据
motionCanvas.width = 640
motionCanvas.height = 480
backgroundCanvas.width = 64
backgroundCanvas.height = 48

Web技术如何实现移动监测
尺寸缩小 10 倍

定时器

我们都知道,当游戏以『每秒60帧』运行时才能保证一定的体验。但对于我们目前的案例来说,帧率并不是我们追求的第一位。因此,每 100 毫秒(具体数值取决于实际情况)取当前帧与前一帧进行比较即可。

另外,因为我们的动作一般具有连贯性,所以可取该连贯动作中幅度最大的(即“分数”最高)或最后一帧动作进行处理即可(如存储到本地或分享到朋友圈)。

延伸

至此,用 Web 技术实现简易的“移动监测”效果已基本讲述完毕。由于算法、设备等因素的限制,该效果只能以 2D 画面为基础来判断物体是否发生“移动”。而微软的 Xbox、索尼的 PS、任天堂的 Wii 等游戏设备上的体感游戏则依赖于硬件。以微软的 Kinect 为例,它为开发者提供了可跟踪最多六个完整骨骼和每人 25 个关节等强大功能。利用这些详细的人体参数,我们就能实现各种隔空的『手势操作』,如画圈圈诅咒某人。

下面几个是通过 Web 使用 Kinect 的库:

  • Depthjs:以浏览器插件形式提供数据访问。

  • node-Kinect2: 以 nodejs 搭建服务器端,提供数据比较完整,实例较多。

  • ZigFu:支持 H5、U3D、Flash,API较为完整。

  • Kinect-HTML5:Kinect-html5 用 C# 搭建服务端,提供色彩数据、深度数据和骨骼数据。

Web技术如何实现移动监测
通过 Node-Kinect2 获取骨骼数据

感谢你能够认真阅读完这篇文章,希望小编分享的“Web技术如何实现移动监测”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网JavaScript频道,更多相关知识等着你来学习!

--结束END--

本文标题: Web技术如何实现移动监测

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

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

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

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

下载Word文档
猜你喜欢
  • Web技术如何实现移动监测
    这篇文章主要介绍了Web技术如何实现移动监测,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Web技术实现移动监测的介绍由上述引用语句可得出“...
    99+
    2024-04-02
  • PHP如何实现web缓存技术
    本篇内容介绍了“PHP如何实现web缓存技术”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、Web缓存的概念Web缓存是指将已被访问过或预...
    99+
    2023-07-05
  • 移动端web如何实现滚动分页
    这篇文章给大家分享的是有关移动端web如何实现滚动分页的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。方法一:前端代码:<script type="tex...
    99+
    2024-04-02
  • 二维码技术如何助力ASP容器实现实时跟踪和监测?
    ASP容器是一种常见的Web应用程序部署工具,它可以提供高可用性和高性能的Web应用程序服务。在实际应用中,ASP容器需要实现对Web应用程序的实时跟踪和监测,以保证Web应用程序的正常运行。 二维码技术作为一种快速获取信息的手段,已经被...
    99+
    2023-10-07
    容器 二维码 实时
  • Golang技术如何推动移动开发创新
    golang通过并发性、效率和简洁性推动移动开发创新:并发性:允许同时执行任务,提高并发请求处理能力。效率:静态类型语言,编译时检查错误,提高应用程序效率。简洁性:语法简洁明了,加快开发...
    99+
    2024-05-11
    golang 移动开发 mysql git 移动应用程序 社交媒体应用 并发请求
  • 移动端开发之Jetpack Hilt技术实现解耦
    目录Hilt是什么Hilt使用地方依赖注入(DI)概念Hilt使用导入Hilt是什么 Hilt 是基于 Dagger2 的针对 Android场景定制化 的框架。 这有点像什么? R...
    99+
    2023-02-17
    Jetpack Hilt解耦 Android Jetpack Hilt解耦
  • JAVA如何实现动态代理技术
    这篇文章主要为大家展示了“JAVA如何实现动态代理技术”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JAVA如何实现动态代理技术”这篇文章吧。一、引出动态代理生活中代理应该是很常见的,比如你可以...
    99+
    2023-05-30
    java
  • web开发移动端如何实现点击动态处理
    这篇文章主要介绍web开发移动端如何实现点击动态处理,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、伪类:active :active伪类常用于设定点击状态下或其他被激活状态下一个...
    99+
    2024-04-02
  • web开发如何实现移动端下拉加载动画
    这篇文章给大家分享的是有关web开发如何实现移动端下拉加载动画的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。  <!DOCTYPE html> &...
    99+
    2024-04-02
  • 如何剖析移动app测试现状
    这期内容当中小编将会给大家带来有关如何剖析移动app测试现状,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。流量为王的概念一推出,导致当今互联网移动app多如繁星,各种行业的企业都在往移动端靠近,但是能够做...
    99+
    2023-06-04
  • JS如何实现移动端实时监听输入框变化
    小编给大家分享一下JS如何实现移动端实时监听输入框变化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!方案一以前做一个简单的模糊搜...
    99+
    2024-04-02
  • 测试驱动技术系列之怎么用pytest实现测试数据驱动
    本篇内容主要讲解“测试驱动技术系列之怎么用pytest实现测试数据驱动”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“测试驱动技术系列之怎么用pytest实现测试数据驱动”吧!一组参数化数据定义参...
    99+
    2023-06-15
  • 如何使用纯js + transition动画实现移动端web轮播图
    这篇文章主要介绍了如何使用纯js + transition动画实现移动端web轮播图,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带...
    99+
    2024-04-02
  • Go中路径实时监测的接口实现,你需要掌握的技术!
    在现代计算机系统中,路径实时监测(Path Monitoring)是非常重要的功能之一。它可以帮助我们监测文件系统中的文件是否被修改,以及进程是否正在运行。在Go语言中,我们可以使用一些库来实现这些功能,本文将介绍如何使用这些库来实现路径...
    99+
    2023-09-01
    接口 实时 path
  • 移动端如何实现内滚动
    这篇文章主要为大家展示了“移动端如何实现内滚动”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“移动端如何实现内滚动”这篇文章吧。发现需求如果在一个区域内只允许部分区域产生滚动的效果,而其余部分不能...
    99+
    2023-06-08
  • 开发技术进阶指南:如何在Python项目中实现自动化测试?
    自动化测试是软件开发过程中的重要环节,它可以帮助开发人员快速测试代码,减少人为错误,提高代码质量。在Python项目中实现自动化测试,可以使用多种工具和框架,本文将介绍如何使用Python自带的unittest框架和第三方库pytest实...
    99+
    2023-06-28
    编程算法 开发技术 git
  • web开发中如何实现无刷新的Ajax分页技术
    这篇文章主要介绍web开发中如何实现无刷新的Ajax分页技术,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!代码如下:<!DOCTYPE html PUBLI...
    99+
    2024-04-02
  • C++技术中的调试:实现自动化测试驱动的调试
    atdd 是一种强大的调试技术,通过自动化测试用例来识别缺陷并解决问题。在 c++++ 中,可以使用 gtest、catch2 和 boost.test 等测试框架来实现 atdd。这些...
    99+
    2024-05-08
    自动化测试 调试 c++ 最大公约数
  • JavaScript实现移动端横竖屏检测
    本文实例为大家分享了JavaScript实现移动端横竖屏检测的具体代码,供大家参考,具体内容如下 一、HTML方法检测 在html中分别引用横屏和竖屏样式 <!-- 引用竖屏的...
    99+
    2024-04-02
  • 教你如何使用Zabbix3.4进行Web监测
    导读zabbix提供web监测,可以实现对网站网页的监测,包括响应速度,状态码访问状态等。本次尝试使用web监测检查网页首页,并尝试状态码200,来衡量网页的情况。主机中增加web场景...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作