OpenCV.js 视频入门
从相机捕获视频
OpenCV.js 通过 video 标签对视频进行读取,使用 canvas 对其进行显示,首先应该创建 HTML 标签
- 一个video标签直接显示视频
- 一个canvas标签用于显示 OpenCV.js 获取的视频
- 创建一个捕获错误信息的标签,我使用的 p 标签
HTML 标签内容如下:
<h2>Video capture example</h2><button id="startAndStop" disabled>Start</button>//用于处理错误信息的显示<p id="errorMessage"></p><table><tr><td><div><video width="400px" height="300px" id="videoInput"></video></div></td><td><div><canvas width="400px" height="300px" id="canvasOutput"></canvas></div></td></tr><tr><td><div>videoInput</div></td><td><div>canvasOutput</div></td></tr></table>
先创建一个用于捕获 信息的 utils 对象
// 创建处理错误信息 传入显示错误信息的 标签idlet utils=new Utils('errorMessage')
OpenCV.js 使用utils 处理视频
- 开始视频:utils.startCamera()
- 结束视频:utils.stopCamera()
cv.Mat()
OpenCV.js cv.Mat()对象用于创建目标对象矩阵,类似opencv python中的numpy.array() 创建矩阵
第一个参数也类似于矩阵中的行,但是传递的是目标对象的高(其实就是行)
第二个参数类似矩阵中的列,传递目标对象的宽
第三个参数为类型,在OpenCV.js 的类型格式如下
cv.CV_8UC1、cv.CV_8UC2、cv.CV_8UC3、cv.CV_8UC4…cv.CV_8UCn
分别代表8位1通道、2通道、3通道对象
在网页获取视频是 获取得到的是 RGBA 4通道的内容,即cv.CV_8UC4,如下为创建源目标矩阵对象和,目标矩阵对象,在本例中在canvas中显示灰度图,故类型为cv.CV_8UC1
// dst 为灰度图 1通道let src=new cv.Mat(video.height,video.width,cv.CV_8UC4)let dst=new cv.Mat(canvasOutput.height,canvasOutput.width,cv.CV_8UC1)
video example
// 加载完成后处理
function opencvReady(){// 定义点击状态let clicked=falselet startAndStop=document.getElementById('startAndStop')let video=document.getElementById('videoInput')let canvasOutput=document.getElementById('canvasOutput')let canvasContext=canvasOutput.getContext('2d')// 创建VideoCapture对象let camera=new cv.VideoCapture(video)// 创建处理错误信息 传入显示错误信息的 标签idlet utils=new Utils('errorMessage')// 移除disabledstartAndStop.removeAttribute('disabled')const fps=30function videoProcess(){// 每次进入过程需重新创建// 创建4通道矩阵 src 为RGBA 4通道 // 由于canvas仅支持具有连续存储的8位RGBA图像,因此cv.Mat类型为cv.CV_8UC4// dst 为灰度图 1通道let src=new cv.Mat(video.height,video.width,cv.CV_8UC4)let dst=new cv.Mat(canvasOutput.height,canvasOutput.width,cv.CV_8UC1)function startProcess(){try{if(!clicked){src.delete()dst.delete() return}let startTime=Date.now()camera.read(src)// 网页获取的 图像为RGB 格式的cv.cvtColor(src,dst,cv.COLOR_RGBA2GRAY)// cv.Canny(dst,dst,50,120)cv.imshow('canvasOutput',dst)// 1000/fps 为 ms/帧 减去处理时间 为延迟// 如果视频是30fps,延迟毫秒应为(1000/30 - processing_time)。let delay = 1000 / fps - (Date.now() - startTime);setTimeout(startProcess, delay);}catch(err){utils.printError(err)}}// 处理第一次setTimeout(startProcess,0)}function onVideoStop(){startAndStop.innerText='Start'clicked=false// 清除画布canvasContext.clearRect(0,0,canvasOutput.width,canvasOutput.height)}function onVideoStart(){startAndStop.innerText='Stop'clicked=truevideoProcess()}// 点击事件startAndStop.addEventListener('click',()=>{if(!clicked){utils.clearError()utils.startCamera('qvga',onVideoStart,'videoInput')}else{utils.stopCamera()onVideoStop()}})}
总结
OpenCV.js 总体上还是和 opencv-python 很类似的,尝试了下Canny 边缘检测发现也是可以的,另外一方面就是OpenCV.js 的面向对象感觉比 opencv-python 更强烈。
OpenCV.js 视频入门相关推荐
- Opencv之视频入门
目录 从相机读取视频 从文件播放视频 保存视频 从相机读取视频 使用Opencv可以直接从摄像头读取视频,首先我们需要创建一个VideoCapture对象,其参数可以是设备索引或者是我们保存的视频文件 ...
- Python+Opencv图像处理新手入门教程(四):视频内容的读取与导出
一步一步来吧 上一节: Python+Opencv图像处理新手入门教程(三):阈值与二值化 1.Intro 今天这节我们主要看怎么利用opencv读取并处理视频中的内容. 2.VideoCapture ...
- OpenCV入门(十七)快速学会OpenCV 16 视频处理
OpenCV入门(十七)快速学会OpenCV 16 视频处理 1.构造VideoCapture对象 2.构造VideoWriter对象 3.视频操作基础 3.1 读取视频帧 3.2 播放视频文件 3. ...
- 学习opencv.js(1)图像入门
目标:了解如何阅读图像以及如何在网络中显示它. 读取图像:OpenCV.js 将图像保存为cv.Mat类型.我们使用 HTML 画布元素将cv.Mat传输到网络或反向传输.ImageData 接口可以 ...
- OpenCV基础知识入门
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文旨在让你快速入门opencv. OpenCV OpenCV是计 ...
- vue.js视频课程_在此免费课程中学习Vue.js! ✨
vue.js视频课程 by ZAYDEK 由ZAYDEK 在此免费课程中学习Vue.js! ✨ (Learn Vue.js in this free course! ?✨) 让我们做点Vueseful ...
- Auto.js视频笔记
跳转总目录 前言 这篇笔记是我跟着视频教程自学时做的笔记 教程来源:b站-墨水心-Auto.js从入门到精通 视频地址:[Auto.js从入门到精通-哔哩哔哩] https://b23.tv/Me45 ...
- python opencv读取视频没声音_python + opencv: 解决不能读取视频的问题
博主一开始使用python2.7和Opencv2.4.10来获取摄像头图像,程序如下: cap = cv2.VideoCapture(0) ret, frame = cap.read() 使用这个程序 ...
- 音视频入门系列-视频封装格式篇(MP4)
接上文,本篇介绍下MP4的封装格式. 1.MP4(MPEG-4) ◆ MP4是一套用于音频.视频信息的压缩编码标准,由国际标准化组织(ISO)和国际电工委员会(IEC)下属的"动态图像专家组 ...
- opencv(C++) 视频处理,通过三通道像素值平均 将视频分辨率缩小为原来的一半
项目要求: 将一个 1920 * 1080 的视频压缩为 960 * 540 的视频,帧率不变.将每个 2 * 2 相邻像素点的像素值求平均,变成一个新的像素点(即 2 * 2 的平均池化). 程序中 ...
最新文章
- python 结束子线程并保证工作完成_python3中在线程中结束工作进程的方法
- 【总结】机器学习划分数据集的几种方法
- c语言中O空字符,OC语言中字符串的使用
- simpla是基于laravel5的php,一个基于laravel5.1的后台
- compat包_使用Compat Patchers,API的稳定性既便宜又容易!
- 分形:MandelBrot和Julia
- 漫画贴:16岁和36岁打球的区别,你是否怀念球场上那个年少的你?
- [转载] python数学计算模块之math常用函数学习使用
- SmartBusinessDevFramework架构设计-2:结构图示
- wsdl2java 生成不带JAXBElement的客户端
- 新能源汽车行业资讯-2022-9-16
- ftp常用命令(windows cmd中使用示例)
- 传奇各大地图编号代码库
- 笔记本电脑搜不到wifi怎么办?
- Android Studio校园二手交易市场app
- python电子章_python二级电子教案 第2章 Python语言基本语法元素
- UC浏览器首页滑动动画实现
- 微软拥抱ChatGPT后,我亲自试了试新必应的个性搜索
- python怎么求商_如何用python求差商?
- 浅谈游戏数据分析------留存篇一---留存折损