从相机捕获视频

OpenCV.js 通过 video 标签对视频进行读取,使用 canvas 对其进行显示,首先应该创建 HTML 标签

  1. 一个video标签直接显示视频
  2. 一个canvas标签用于显示 OpenCV.js 获取的视频
  3. 创建一个捕获错误信息的标签,我使用的 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 视频入门相关推荐

  1. Opencv之视频入门

    目录 从相机读取视频 从文件播放视频 保存视频 从相机读取视频 使用Opencv可以直接从摄像头读取视频,首先我们需要创建一个VideoCapture对象,其参数可以是设备索引或者是我们保存的视频文件 ...

  2. Python+Opencv图像处理新手入门教程(四):视频内容的读取与导出

    一步一步来吧 上一节: Python+Opencv图像处理新手入门教程(三):阈值与二值化 1.Intro 今天这节我们主要看怎么利用opencv读取并处理视频中的内容. 2.VideoCapture ...

  3. OpenCV入门(十七)快速学会OpenCV 16 视频处理

    OpenCV入门(十七)快速学会OpenCV 16 视频处理 1.构造VideoCapture对象 2.构造VideoWriter对象 3.视频操作基础 3.1 读取视频帧 3.2 播放视频文件 3. ...

  4. 学习opencv.js(1)图像入门

    目标:了解如何阅读图像以及如何在网络中显示它. 读取图像:OpenCV.js 将图像保存为cv.Mat类型.我们使用 HTML 画布元素将cv.Mat传输到网络或反向传输.ImageData 接口可以 ...

  5. OpenCV基础知识入门

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文旨在让你快速入门opencv. OpenCV OpenCV是计 ...

  6. vue.js视频课程_在此免费课程中学习Vue.js! ✨

    vue.js视频课程 by ZAYDEK 由ZAYDEK 在此免费课程中学习Vue.js! ✨ (Learn Vue.js in this free course! ?✨) 让我们做点Vueseful ...

  7. Auto.js视频笔记

    跳转总目录 前言 这篇笔记是我跟着视频教程自学时做的笔记 教程来源:b站-墨水心-Auto.js从入门到精通 视频地址:[Auto.js从入门到精通-哔哩哔哩] https://b23.tv/Me45 ...

  8. python opencv读取视频没声音_python + opencv: 解决不能读取视频的问题

    博主一开始使用python2.7和Opencv2.4.10来获取摄像头图像,程序如下: cap = cv2.VideoCapture(0) ret, frame = cap.read() 使用这个程序 ...

  9. 音视频入门系列-视频封装格式篇(MP4)

    接上文,本篇介绍下MP4的封装格式. 1.MP4(MPEG-4) ◆ MP4是一套用于音频.视频信息的压缩编码标准,由国际标准化组织(ISO)和国际电工委员会(IEC)下属的"动态图像专家组 ...

  10. opencv(C++) 视频处理,通过三通道像素值平均 将视频分辨率缩小为原来的一半

    项目要求: 将一个 1920 * 1080 的视频压缩为 960 * 540 的视频,帧率不变.将每个 2 * 2 相邻像素点的像素值求平均,变成一个新的像素点(即 2 * 2 的平均池化). 程序中 ...

最新文章

  1. python 结束子线程并保证工作完成_python3中在线程中结束工作进程的方法
  2. 【总结】机器学习划分数据集的几种方法
  3. c语言中O空字符,OC语言中字符串的使用
  4. simpla是基于laravel5的php,一个基于laravel5.1的后台
  5. compat包_使用Compat Patchers,API的稳定性既便宜又容易!
  6. 分形:MandelBrot和Julia
  7. 漫画贴:16岁和36岁打球的区别,你是否怀念球场上那个年少的你?
  8. [转载] python数学计算模块之math常用函数学习使用
  9. SmartBusinessDevFramework架构设计-2:结构图示
  10. wsdl2java 生成不带JAXBElement的客户端
  11. 新能源汽车行业资讯-2022-9-16
  12. ftp常用命令(windows cmd中使用示例)
  13. 传奇各大地图编号代码库
  14. 笔记本电脑搜不到wifi怎么办?
  15. Android Studio校园二手交易市场app
  16. python电子章_python二级电子教案 第2章 Python语言基本语法元素
  17. UC浏览器首页滑动动画实现
  18. 微软拥抱ChatGPT后,我亲自试了试新必应的个性搜索
  19. python怎么求商_如何用python求差商?
  20. 浅谈游戏数据分析------留存篇一---留存折损

热门文章

  1. idea社区版 html,利用IntelliJ IDEA社区版开发servlet
  2. COMSOL随机裂缝生成
  3. SaaSBase:什么是零一裂变SCRM?
  4. php阿拉伯数字转换大写,php 阿拉伯数字如何转大写
  5. windows 管理员权限编辑文件
  6. html 英文艺术字体,生日快乐英文艺术字体
  7. ArcGIS 地类净面积计算工具
  8. oracle优化distinct,oracle 索引优化之distinct
  9. android接入华为推送,华为推送
  10. JavaScript练习(一)——跟随鼠标移动