使用faceapi智能识别人脸,stomp实现项目之间通讯功能

文章讲述了如何在WebRTC项目中集成FaceAPI进行人脸识别,并利用stompjs实现实时通讯,确保会议功能根据人脸识别结果调整并与大厅业务交互。开发者介绍了FaceAPI的接入、模型加载、视频流处理以及stompjs的客户端配置和消息传递机制。
摘要由CSDN通过智能技术生成

功能描述:有两个项目,一个项目是会议功能,需要在webrtc现有的基础上接入智能人脸识别功能,使用的是faceapi;另一个项目是大厅的业务功能,两个项目之间需要会议项目根据人脸识别的结果,通讯给大厅给予提示或者中断业务,大厅点击“已调整”需要通讯会议进行再次人脸识别确认。

归纳所述就是,faceapi接口能力和相机流对接,stompjs实现项目之间的通讯。

一,首先是faceapi的接入,之前写过一个demo测试功能,demo内容,现在需要做的是和业务进行对接。

找到业务中的相机流,可以获取到<video>标签元素,用变量video来表示,detectFace是识别方法的封装。

 if(xxxx){  // 一些判断条件
    this.detectFace(video)  // 封装识别的方法
 }
/**
     * 识别人脸
     */
    detectFace(video1){
      const video = video1
      let func = async () => {  
        const detections = await faceapi.detectAllFaces(video, new faceapi.SsdMobilenetv1Options({minConfidence:0.5}))
        if(detections && detections.length>0){
          ElementUI.Notification({
            title: '人脸智能检测结果',
            message: '已经检测到人脸',
            duration: 10000
          })
          this.sendMessage_face({'face_detect':true,'account':state.data.account,"source":"meeting"})
        }else{
          // 提示方式
          if(this.paramsobj.faceCheckMode == '01'){
            ElementUI.Notification({
              title: '人脸智能检测结果',
              message: '没有检测到人脸',
              duration: 10000
            })
          }
          this.sendMessage_face({'face_detect':false,'account':state.data.account,"source":"meeting"})
        }
        return func  
      }
      if (!this._isAudioOnlyMode) { 
        const faceapi = window.faceapi
        Promise.all([
          faceapi.nets.ssdMobilenetv1.loadFromUri('/models') 
        ]).then( async ()=>{
          func()  // setInterval 立即执行一次
          this._localCameraStreamInterval = setInterval(func,1000 * 60);
        });
      }
    }

1,引入faceapi,可以是cdn或者npm的方式
2,使用模型之前,先引入模型,Promise.all([]) 可以引入多个模型,注意路径。
3,引入后,就可以使用模型了,这里因为要检查视频流,所以需要setInterval先执行一次在定时执行。
4,const detections = await faceapi.detectAllFaces(video, new faceapi.SsdMobilenetv1Options({minConfidence:0.5})) 就是执行方式,会得到识别后的结果,有结果会返回数组,可能有多个,没有识别到就是空的。
5,根据是否识别的结果进行 sendMessage 进行通讯。

二,stompjs 开启 websocket 客户端,进行服务器之间的订阅和发送消息,服务器进行两个项目的转发,得到通讯结果。

安装stompjs,建立client客户端,url是和后端配合定好的,需要ws的user和password信息,接收心跳或者不接收,可以配置,connect 建立联系,debug关闭,可以自定义(输出太频繁所以关了)

      this.client = Stomp.client(this.url)
      var headers = {
        'login': 'ws的user',
        'passcode': 'ws的password',
        'host': '/', // 虚拟主机,默认“/”
        'heart-beat': '60,60'  // 心跳
      }
      this.client.connect(headers, this.onConnected, this.onFailed)
      this.client.debug = null

在onConnected中,表示成功建立了联系,就可以进行一些订阅,可以订阅多条

onConnected (frame) {
      var exchange = this.mqurl + this.params
      this.client.subscribe(exchange, this.responseCallback, this.onFailed) 
      this.client.subscribe('/exchange/face_check_topic_exchange/'+this.params, this.resCallback)  // 人脸识别通讯
    },

有一点要注意,subscribe也可以自定义一些内容,我其中用到了id,可以使用传入的参数值作为sub-id,保持唯一性,在业务上需要切换重新建立连接中,这样做可以保证ws的心跳。subscribe会返回id,可以unsubscribe。

this.dingId = this.client.subscribe('/exchange/face_check_topic_exchange/' + this.channelId, this.resCallback, {id:'sub-face'}) // 人脸识别通讯

this.dingId ? this.client.unsubscribe(this.dingId.id) : null

订阅完成,那么send就可以发送消息,确保和订阅地址是一致的。

sendMessage_face (data) {
      this.client.send('/exchange/face_check_topic_exchange/' + this.channelId, {}, JSON.stringify(data))
    },

发送的内容 json 格式,有一个大小要求要注意,尽可能传递有用和简洁的信息。订阅时绑定的callback函数会接收到 frame 得到发送来的消息,后续处理就是业务代码的事了。

resCallback (frame) {
      let data = JSON.parse(frame.body)
}

stompjs  基础用法

connect(headers, connectCallback): 建立websocket连接,headers可以是一个对象或者函数,connectCallback是连接成功后的回调函数

disconnect(disconnectCallback): 断开websocket连接,disconnectCallback是断开连接后的回调函数

send(destination, headers, body): 向指定目的地发送消息,destination是消息发送的目的地,headers是一个对象,body是消息体

subscribe(destination, callback, headers): 订阅指定目的地的消息,destination是消息发送的目的地,callback是接收到消息后的回调函数,headers是一个对象

unsubscribe(id): 取消订阅,id是订阅者的标识符

begin(transaction): 开始一个事务,transaction是事务的id

commit(transaction): 提交一个事务,transaction是事务的id

abort(transaction): 中止一个事务,transaction是事务的id

ack(messageID, subscription, headers): 确认收到消息,messageID是消息的id,subscription是消息的订阅者,headers是一个对象

nack(messageID, subscription, headers): 不确认收到消息,messageID是消息的id,subscription是消息的订阅者,headers是一个对象

stompjs 用法参考 链接

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值