【笔记】前端人脸检测之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 ...
随机推荐
- 使用libzip压缩文件和文件夹
简单说说自己遇到的坑: 分清楚三个组件:zlib.minizip和libzip.zlib是底层和最基础的C库,用于使用Deflate算法压缩和解压缩文件流或者单个文件,但是如果要压缩文件夹就很麻烦,主 ...
- VBA | 统计数组某元素出现的次数,适用于一维、二维数组
很简单的需求,但是中文网络上基本都是循环的方法,经过查找下面的方法很有效.为了方便用户的使用,进行了如下的整改. 1 Sub Statistics_Number_of_occurrences_test ...
- 可视化—gojs 超多超实用经验分享(三)
目录 32.go.Palette 一排放两个 33.go.Palette 基本用法 34.创建自己指向自己的连线 35.设置不同的 groupTemplate 和 linkTemplate 36.监听 ...
- NodeJS中Buffer与字符串相互转换时一个值得注意的问题
什么问题 如果一个Buffer的 toString() 结果为乱码或含有乱码,那么用此字符串以 Buffer.from()方法构造出来的Buffer将与原来的Buffer不相同. 这一点其实很好理解, ...
- 记录一次在欧拉(openEuler22.03LTS-SP4)系统下安装(踩坑)Freeswitch1.10.11的全过程
目录 前言 安装环境 1. 下载Freeswitch 1.1 git clone 下载freeswitch库 1.2 官网下载 2. 开始安装前的工作 2.1 安装编译时需要的环境[先安装这个!] 2 ...
- DASCTF 2023六月挑战赛|二进制专项 PWN (上)
DASCTF 2023六月挑战赛|二进制专项 PWN (上) 1.easynote edit函数对长度没有检查 free函数存在UAF漏洞 思路:1.通过堆溢出,UAF,修改size位达到堆块重叠,使 ...
- 记一次在openEuler系统下离线编译升级到openssh9.8p1
缘起 由于某个项目上甲方对服务器进行漏洞扫描,系统为:openEuler 22.03 (LTS-SP4).提示现有OpenSSH版本存在漏洞,需要升级到openssh-9.8p1的版本(目前最新),遂 ...
- Java工具库——Hutool的常用方法
Hutool-All(或简称Hutool)是一个功能强大的Java编程工具库,旨在简化Java应用程序的开发. 它提供了大量的工具类和方法,涵盖了各种常见任务,包括字符串处理.日期时间操作.文件操作. ...
- NIO操作文件读写
第一章 第一节,Buffuer 案例一 从buffur 读出数据, 创建了一个 FileInputStream 对象,并通过调用 getChannel() 方法获取了与之关联的 FileChanne ...
- web3 产品介绍:硬件钱包Ledger 离线管理私钥更安全
Ledger是一款硬件钱包,可以安全地存储用户的加密资产,并在需要时进行交易.作为一种离线存储设备,Ledger钱包比在线钱包更加安全,因为它能够保护用户的私钥和交易信息,使其免受黑客攻击和网络病毒的 ...