如何在 h.265 视频流中抓取到人脸并生成图片

如何在 h.265 视频流中抓取到人脸并生成图片

一、前言

现在的 web 需求也是越来越刁钻了。今天接到了一个奇怪的需求,要求在大屏播放实时直播的视频流,并且还要截取播放时段内一共出现了哪些人。

因此,首先第一步我们要先把视频流在 web 界面中播放出来,不然啥都白瞎。

当视频流播放出来了,我们再来思考抓取人脸的能力。

二、视频流播放

1、视频流介绍

如果还未接触过视频流的小伙伴肯定对视频流很陌生,那我们就来快速简单的了解一下视频流是什么东西。

视频流逝一种实时通讯技术,就是生成一段在线的链接,渲染在 web 界面上,实时传播别处视频或者直播的内容,你也可以理解为直播。

我们常见的视频流后缀有 m3u8,mp4,rstp,rtmp 等等。

rstp,rtmp 通常不适合在 web 上进行播放,因为浏览器限制、协议不兼容等。

因此我们可以用 m3u8,mp4 来进行开发。这个后缀可以让后端来处理,哪怕是 rstp,rtmp 的格式,也能通过转码来实现。

2、视频流格式

好了马上进入开发。。。等等先别急,我们需要先知道先视频流有哪些格式,我们使用的插件能否这些个时代的播放。

百度文心一言一下马上就知道视频流有 H.264H.265 两种编码格式。

  • H.264 是目前最广泛使用的视频编码,以其高效的压缩性能、良好的网络适应性和广泛的兼容性而备受推崇。
  • H.265H.264 的继任者,保持相同视频质量的前提下,能够实现更高的压缩比,从而进一步降低网络带宽的占用。

简单的说就是 H.265 更新,更牛。

目前市面上能查询得到的 web 播放插件几乎都只能支持 H.264。我这里实现过 vue-video-player 这款插件,有兴趣的小伙伴的小伙伴百度下使用教程,百度上说的可比我更详细,这不是今天的重点。

那如何能够能够既支持 H.264 又支持 H.265 的插件呢?在我查得快要放弃的时候,@easydarwin/easyplayer 这个插件竟神奇般的播放出来。

3、视频流播放

# 依赖安装
npm install @easydarwin/easyplayer

这个插件安装完可不算完,还需要一步最重要的 copy 功能,这一步决定了你视频流能不能正常播放。

copy node_modules/@easydarwin/easyplayer/dist/component/EasyPlayer.swf 到 静态文件 根目录
copy node_modules/@easydarwin/easyplayer/dist/component/crossdomain.xml 到 静态文件 根目录
copy node_modules/@easydarwin/easyplayer/dist/component/EasyPlayer-lib.min.js 到 静态文件 根目录

就是把 node_modules 对应路径下的这三个文件放到项目中的根目录下。

最后在 index.html 下引入这三个文件:

<script src="./EasyPlayer-lib.min.js"></script>
<script src="./crossdomain.xml"></script>
<script src="./EasyPlayer.wasm"></script>
<EasyPlayer
    style="width: 750px; height: 500px"
    :videoUrl="`http://cdn3.toronto360.tv:8081/toronto360/hd/playlist.m3u8`"
    aspect="16:9"
    live
    :fluent="true"
    :autoplay="true"
    video-id="videoElement"
    ref="easyPlayerRef"
    stretch
></EasyPlayer>

使用过于简单。这里提供几个可用的视频流用于小伙伴们测试。

  • http://kbs-dokdo.gscdn.com/dokdo_300/definst/dokdo_300.stream/playlist.m3u8
  • https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/hls/xgplayer-demo.m3u8
  • http://cdn3.toronto360.tv:8081/toronto360/hd/playlist.m3u8

三、手把手教你人脸抓取

百度一查有且只有 face-api.js 提供了该能力,或者说是应用最广的插件。

yarn add face-api.js

在使用前我们还要引入对应的识别模型,这些模型是开发者通过测试实现的模型,当然我们可以对模型进行修改,不过我没改,因为我看不懂~

官方 gitHub 提供了这些模型,我们只需要将这些模型下载下来,并同样复制到静态文件根目录下就行。

### QThalcon 人脸识别概述 QThalcon 是基于 Halcon 的 Qt 库扩展,用于计算机视觉应用开发。Halcon 自身提供了强大的机器视觉工具集,在工业检测、机器人导航等领域广泛应用。然而,对于特定的人脸识别任务,通常会依赖于专门设计的算法和框架。 尽管官方文档可能未直接提供针对 QThalcon 的人脸识别教程[^1],可以借鉴其他相似平台的经验结合 Halcon 提供的基础功能实现这一目标。下面介绍一种利用 Halcon 进行人脸识别的方法,给出相应代码片段作为参考: ### 准备工作 安装必要的软件包: - 安装最新版本的 MVTec HALCON 及其对应的 Qt 绑定——QTHalcon。 - 配置好环境变量以便能够顺利调用相关函数。 加载所需模块: ```cpp #include "halcon.h" #include <QtWidgets/QApplication> #include <QWidget> ``` 初始化 HDevEngine 实例来进行交互式脚本执行以及图像处理操作。 ### 创建窗口界面 构建简单的 GUI 来展示摄像头捕获的画面及识别结果: ```cpp class MainWindow : public QWidget { // ...省略部分代码... }; int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } ``` ### 图像采集与预处理 通过设备接口获取实时视频流帧数据,将其转换成适合后续分析的形式: ```cpp // 打开相机连接 HTuple acqHandle; HOperatorSet::OpenFramegrabber("GigE", "Default", -1, -1, -1, -1, "", 0, "default", &acqHandle); while (true) { HObject img; HTuple width, height; // 抓取一帧图片 HOperatorSet::GrabImage(img, acqHandle); // 显示原始图像尺寸信息 HOperatorSet::GetImageSize(img, &width, &height); qDebug() << QString("Width:%1 Height:%2").arg(width).arg(height); } // 关闭相机连接 HOperatorSet::CloseFramegrabber(acqHandle); ``` ### 特征点定位 采用 Haar-like 或者更先进的 CNN 方法来精确定位面部区域内的关键部位坐标位置(如眼睛中心、鼻尖等),从而为进一步提取描述子奠定基础。 ### 描述符计算 一旦获得了足够的地标点之后,则可运用局部二值模式直方图(LBP)或其他技术生成固定长度向量表示每张面孔的独特属性;此过程类似于 Python 中 `face_recognition` 库所使用的 dlib 工具链中的做法。 ### 训练分类器 收集多组样本建立正负两类集合后,选用支持向量机(SVM)或者其他合适的监督学习模型完成最终决策边界的学习。 请注意上述内容仅作为一个简化版的工作流程示意而非完整的解决方案。实际项目里还需要考虑诸如光照变化适应性调整、姿态估计补偿等诸多因素的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值