【笔记】前端人脸检测之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 ...
随机推荐
- 最近很火的Vue Vine是如何实现一个文件中写多个组件
前言 在今年的Vue Conf 2024大会上,沈青川大佬(维护Vue/Vite 中文文档)在会上介绍了他的新项目Vue Vine.Vue Vine提供了全新Vue组件书写方式,主要的卖点是可以在一个 ...
- mysql 删除数据表报错 表删除时 Cannot delete or update a parent row: a foreign key constraint fails 异常处理
mysql 删除数据表报错 表删除时 Cannot delete or update a parent row: a foreign key constraint fails 异常处理 MySQL报错 ...
- [oeasy]python0074_修改字体背景颜色_background_color_背景色
修改背景色 回忆上次内容 上次将asciiart和颜色一起来玩 7 种基本色 变化多端 不过到目前为止 改的 都是前景色 背景色可以修改吗? 重温参数 具体动手试试 print("\033[ ...
- TIER 2: Archetype
TIER 2: Archetype 扫描 nmap 使用 nmap 进行扫描目标 IP,发现目标是 Windows 服务器,开放 SMB 和 SQL Server 服务. SMB SMB 之前已经接触 ...
- Win10下安装LabelImg以及使用--LabelImg
labelImg是图片标注软件,用于数据集的制作.标注等等.下面介绍labelImg的安装过程. 我用的是anaconda,所以以anaconda prompt作为终端: 在Anaconda Prom ...
- 从DDPM到DDIM (一) 极大似然估计与证据下界
从DDPM到DDIM (一) 极大似然估计与证据下界 现在网络上关于DDPM和DDIM的讲解有很多,但无论什么样的讲解,都不如自己推到一遍来的痛快.笔者希望就这篇文章,从头到尾对扩散模型做一次完整 ...
- LeetCode455.分发饼干
LeetCode题目链接:https://leetcode.cn/problems/assign-cookies/description/ 题目叙述 假设你是一位很棒的家长,想要给你的孩子们一些小饼干 ...
- 记录一下实习的第一次线下面试的答辩经历,关于seata|sentinel,gateway与栈
面的一家小公司,他们准备做单体架构升级到微服务,所以问了我一些微服务相关的东西.回答的依托答辩,今天回想起来记录一下我造出来的笑话,正常的就不写在这里了. 首先我简历上大部分写的是熟悉,只有微服务写的 ...
- 在Centos7中使用一键脚本安装Oracle11g
在Centos7中使用一键脚本安装Oracle11g 1. 环境准备 1.1 系统版本:Centos7.9(2009) 1.2 Oracle版本:Oracle 11g 11.2.0.4 1.3 网络需 ...
- docker 概念,安装,启动,运行
docker概念,安装,启动,运行模式 docker的概念 镜像(image) 模板,可以通过模板来创建容器服务,tomcat镜像===>run==>tomacat01容器(提供服务),通 ...