【笔记】前端人脸检测之clmtrackr.js的使用
clmtrackr.js使用示例代码
html代码:
<div class="video-con">
<video id="video" playsinline autoplay width="300" height="300"></video>
<canvas style="visibility: hidden" id="canvas" width="300" height="300"></canvas>
</div>
js代码:
import clm from "./clmtrackr.js";
export class FaceDemo {
constructor(options, successFunction) {
const opts = {
videoId: "video",
canvasId: "canvas",
mediaConfig: {
audio: false,
video: {
width: { min: 320, ideal: 720 },
height: { min: 320, ideal: 720 },
facingMode: "user"
}
}
};
this.video = document.getElementById(videoId);
this.canvasId = canvasId;
this.trackingStarted = false; // 是否开始检测人脸
this.chunks = []; // 视频文件
this.mediaRecorder = null; // 录制的视频对象
this.getUserMedia();
}
// 原生设备摄像头兼容性getUserMedia
getUserMedia() {
window.URL = window.URL || window.webkitURL || window.msURL || window.mozURL;
if (navigator.mediaDevices === undefined) {
navigator.mediaDevices = {};
}
if (navigator.mediaDevices.getUserMedia === undefined) {
navigator.mediaDevices.getUserMedia = function (constraints) {
const getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
if (!getUserMedia) {
return Promise.reject(new Error("当前浏览器不支持getUserMedia"));
}
return new Promise(function (resolve, reject) {
getUserMedia.call(navigator, constraints, resolve, reject);
});
};
}
}
// 初始化多媒体视频录制实例
initRecorder(stream) {
const self = this;
this.mediaRecorder = new MediaRecorder(stream);
this.chunks = [];
this.mediaRecorder.ondataavailable = function (event) {
if (event.data && event.data.size > 0) {
self.chunks.push(event.data);
}
};
this.mediaRecorder.onstop = () => {
let recorderFile = new Blob(this.chunks, {
type: "video/mp4"
});
// 供下载视频文件
const url = window.URL.createObjectURL(recorderFile);
const a = document.createElement("a");
a.style.display = "none";
a.href = url;
a.download = "video.mp4";
document.body.appendChild(a);
a.click();
// 供提交视频流
const file = new File([recorderFile], "video.mp4", {
type: "video/mp4"
});
};
}
// 开始录制视频
startRecorder() {
this.mediaRecorder.start();
}
// 结束视频录制
endRecorder() {
this.mediaRecorder.stop();
}
init() {
if (window.stream) {
window.stream.getTracks().forEach((track) => {
track.stop();
});
}
return new Promise((resolve, reject) => {
const self = this;
navigator.mediaDevices
.getUserMedia(this.options.mediaConfig)
.then((stream) => {
if ("srcObject" in this.video) {
window.stream = stream;
this.video.srcObject = stream;
} else {
this.video.src = window.URL && window.URL.createObjectURL(stream);
}
this.initRecorder(stream); // 初始化视频录制实例
this.startRecorder(); // 开始录制视频
this.video.onloadedmetadata = function () {
self.video.play();
setTimeout(() => {
self.positionLoop();
}, 1000);
};
this.video.onresize = function () {
if (self.trackingStarted) {
this.ctrack.stop();
this.ctrack.reset();
this.ctrack.start(self.video);
}
};
resolve();
})
.catch((err) => {
console.log("失败:" + err.message);
reject(err);
});
});
}
positionLoop() {
const self = this;
this.ctrack = new clm.tracker();
this.ctrack.init();
this.ctrack.start(this.video);
this.trackingStarted = true;
this.drawCanvas = document.getElementById(this.canvasId);
this.canvasCtx = this.drawCanvas.getContext("2d");
function drawLoop() {
requestAnimationFrame(drawLoop);
const positions = self.ctrack && self.ctrack.getCurrentPosition();
if (positions) {
// 检测到人脸模型数据,进行相应的操作
} else {
// 没有检测到人脸
console.log("没有检测到人脸");
}
}
drawLoop();
}
}
常见代码片段整理
navigator.mediaDevices.getUserMedia兼容处理
根据官方文档,目前navigator.mediaDevices.getUserMedia在ios上只支持11版本以上,且只能在safari正常运行。安卓目前没有发现版本限制,需要兼容的代码:
getUserMedia() {
window.URL = window.URL || window.webkitURL || window.msURL || window.mozURL;
if (navigator.mediaDevices === undefined) {
navigator.mediaDevices = {};
}
if (navigator.mediaDevices.getUserMedia === undefined) {
navigator.mediaDevices.getUserMedia = function (constraints) {
const getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
if (!getUserMedia) {
return Promise.reject(new Error("当前浏览器不支持getUserMedia"));
}
return new Promise(function (resolve, reject) {
getUserMedia.call(navigator, constraints, resolve, reject);
});
};
}
}
第一次启用成功调用前置摄像头,第二次需要调用后置却黑屏或者失败
前置摄像头调用后,摄像功能需要关闭后才能正常执行第二次调用,否则会报错:设备被占用。解决方法,在每次执行调用方法前,先关闭摄像设备。
if (window.stream) {
window.stream.getTracks().forEach((track) => {
track.stop();
});
}
设置录制视频分辨率
navigator.mediaDevices.getUserMedia({
audio: true,
video: {
width: { min: 320, ideal: 720 },
height: { min: 320, ideal: 720 },
facingMode: "user"
}
})
MediaRecorder录制视频
initRecorder(stream) {
const self = this;
this.mediaRecorder = new MediaRecorder(stream);
this.chunks = [];
this.mediaRecorder.ondataavailable = function (event) {
if (event.data && event.data.size > 0) {
self.chunks.push(event.data);
}
};
this.mediaRecorder.onstop = () => {
let recorderFile = new Blob(this.chunks, {
type: "video/mp4"
});
// 供下载视频文件
const url = window.URL.createObjectURL(recorderFile);
const a = document.createElement("a");
a.style.display = "none";
a.href = url;
a.download = "video.mp4";
document.body.appendChild(a);
a.click();
// 供提交视频流
const file = new File([recorderFile], "video.mp4", {
type: "video/mp4"
});
};
}
参考地址
- clmtrackr.js官网API
- clmtrackr.js官网示例代码
- 基于前端的人脸探测小DEMO
- HTML5通过navigator.mediaDevices.getUserMedia调用手机摄像头问题
【笔记】前端人脸检测之clmtrackr.js的使用的更多相关文章
- OpenCV 学习笔记 05 人脸检测和识别
本节将介绍 Haar 级联分类器,通过对比分析相邻图像区域来判断给定图像或子图像与已知对象是否匹配. 本章将考虑如何将多个 Haar 级联分类器构成一个层次结构,即一个分类器能识别整体区域(如人脸) ...
- 前端人脸识别框架Tracking.js与JqueryFaceDetection
这篇文章主要就介绍两种前端的人脸识别框架(Tracking.js和JqueryFaceDetection) 技术特点 Tracking.js是使用js封装的一个框架,使用起来需要自己配置许多的东西,略 ...
- OpenCV 学习笔记 05 人脸检测和识别 AttributeError: module 'cv2' has no attribute 'face'
1 环境设置: win10 python 3.6.8 opencv 4.0.1 2 尝试的方法 在学习人脸识别中,遇到了没有 cv2 中没有 face 属性.在网上找了几个方法,均没有成功解决掉该问题 ...
- OpenCV 学习笔记 07 目标检测与识别
目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...
- 基于OpenCv的人脸检测、识别系统学习制作笔记之二
在网上找到了一个博客,里面有大量内容适合初学者接触和了解人脸检测的博文,正好符合我目前的学习方面,故将链接放上来,后续将分类原博客的博文并加上学习笔记. 传送门: http://blog.sina.c ...
- MTCNN人脸检测识别笔记
论文:Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks 论文链接:https:// ...
- 基于OpenCv的人脸检测、识别系统学习制作笔记之三
1.在windows下编写人脸检测.识别系统.目前已完成:可利用摄像头提取图像,并将人脸检测出来,未进行识别. 2.在linux下进行编译在windows环境下已经能运行的代码. 为此进行了linux ...
- 基于OpenCv的人脸检测、识别系统学习制作笔记之一
基于OpenCv从视频文件到摄像头的人脸检测 在OpenCv中读取视频文件和读取摄像头的的视频流然后在放在一个窗口中显示结果其实是类似的一个实现过程. 先创建一个指向CvCapture结构的指针 Cv ...
- 人脸检测学习笔记(数据集-DLIB人脸检测原理-DLIB&OpenCV人脸检测方法及对比)
1.Easily Create High Quality Object Detectors with Deep Learning 2016/10/11 http://blog.dlib.net/201 ...
- [转]40多个关于人脸检测/识别的API、库和软件
[转]40多个关于人脸检测/识别的API.库和软件 http://news.cnblogs.com/n/185616/ 英文原文:List of 40+ Face Detection / Recogn ...
随机推荐
- redis基本数据结构-有序集合
redis基本数据结构-有序集合zset 特性 使用哈希表+跳表数据结构存储 每个元素由 分数和字段名 两部分组成 增加元素 zadd key score1 member1 [score2 membe ...
- 新一代云原生日志架构 - Loggie的设计与实践
Loggie萌芽于网易严选业务的实际需求,成长于严选与数帆的长期共建,持续发展于网易数帆与网易传媒.中国工商银行的紧密协作.广泛的生态,使得项目能够基于业务需求不断完善.成熟.目前已经开源:https ...
- 如何删除Git中缓存的用户名和密码
昨天在上传代码的时候提示输入用户名密码,结果输错了3次就没有提示框了,就一直报错(身份验证失败),没办法提交代. 在使用git的过程中,我们也会经常遇到以前保存在git的用户名密码忘记了,或者不用了. ...
- suffix-icon属性隐藏el-select下拉框右边的下拉图标
<el-form-item label="入库类型" prop="mt_type"> <el-select v-model="for ...
- oeasy 教您玩转linux 010304 图形界面 xfce
我们来回顾一下 上一部分我们都讲了什么? 讲了文件管理器和命令行终端互相交互 用命令nautilus在文件管理器打开某路径 这次我们来看看 图形用户界面(GUI)的情况 图形界面和发行版的关系 一个发 ...
- MFC的消息反射
这边我用对话框来测试mfc的消息反射 当对话框初始化完成之后,点击按钮,首先相应CDialog::OnCommand其中wpARAM(低八位nId,高八位子控件句柄) 和LPARAM(句柄) OnCo ...
- 【服务器】Ubuntu虚拟内存设置
引子 最近服务器内存老是爆掉,64G的内存对于四五个人同时使用还是有点勉强,上网查询了一下虚拟内存的教程,本博客记录一下方法. swap内存设置 假设你想将swap文件放在/mnt/data/mem目 ...
- php 模型浏览器
docker安装 文档:https://github.com/SeleniumHQ/docker-selenium docker run -d -p 4444:4444 -p 7900:7900 -- ...
- ambari+ bigtop 编译、打包、部署步骤总览
1 ambari + bigtop 构建大数据基础平台 1.1 参考: 1.2 参考 amabri bigtop 打包部署 2 ambari+bigtop编译.打包.部署 2.0 基础环境准备 2.1 ...
- a-from提交时遇到errorFields:[]验证错误(vue3)
应用场景:使用a-form组件,里面使用a-select组件:当a-select组件内的值发生改变时,调用a-form的验证表单,进而提交. 问题:提交时遇到errorFields:[]验证错误 解决 ...