AI 虚拟背景

更新时间: 2024/03/15 17:26:13

网易云信 AI 虚拟背景 SDK 基于高精度的 AI 人体检测和人像分割技术,自动识别场景中的人像,支持在各种复杂场景下精准实现人景分离和背景替换。本文档介绍如何基于网易云信 AI 虚拟背景 SDK(NERTC VirtualBackground SDK),在音视频场景中实现背景替换的效果。

接入网易云信 AI 虚拟背景 SDK 后,配合 NERTC SDK,应用可以自动识别通话和直播中的人像,并将参会人周围的环境进行虚化显示或替换为指定图像。

  • 社交娱乐场景,主播在直播过程中,可以将虚拟背景设置为贴合直播主题的画面,提升观众的体验;此外,还能够对主播的隐私起到保护作用。
  • 在线教育场景,老师可以将教学内容相关场景设为背景,提升课程的沉浸感。
  • 智慧金融场景,虚拟背景能起到取代坐席背景墙的作用,有利于银行等金融机构的坐席人员在业务办理过程中规范通话背景以及节约传统背景板的成本。

注意事项

  • 建议在背景相对简单、采光相对均匀的情况下使用此功能。
  • 在背景要求较高的场景中,可以在通话用户的身后搭建绿幕,以获得更好的虚拟背景使用体验。
  • 虚拟背景 SDK 不支持同时实现背景虚化和背景替换效果。

项目结构

AI 虚拟背景 SDK 的主要文件位于 /3rdparty/matting_service/win 中,其中主要项目文件如下:

文件夹 文件 说明
include 头文件所在路径。
x64 bin 64 位 dll 版本。
lib 32 位 dll 版本。
x86 bin 64 位 dll 版本。
lib 32 位 dll 版本。

环境准备

  • 开发环境:Microsoft Visual Studio 2017(推荐)或以上版本
  • 操作系统:Microsoft Windows 7 或以上版本
  • 编译器:Microsoft Visual C++ 2017 或以上版本
  • 运行示例项目需要使用 OpenSSL。

集成 SDK

前期准备

  1. 官网首页通过微信、在线消息或电话等方式联系云信商务经理获取 AI 虚拟背景 SDK。

  2. 将库文件拷贝到本地目录 3rdparty\matting_service\

  3. 在工程文件中导入库。

    例如在 QT Creator 中导入库:

    DEFINES += USE_AILAB
    
    // 下面是x64的方法
    contains(DEFINES, USE_AILAB) {
        INCLUDEPATH += $$PWD/3rdparty/matting_service/include/
    
        LIBS += "$$PWD/3rdparty/matting_service/x64/lib/matting_service.lib"
    }
    

实现步骤

  1. 初始化 matting_service
    MattingInit(nullptr);
    
    // 使用背景图片,最好使用32bit对齐的背景图 (二选一)
    QImage img(":/image/matting_bg2.png");
    img.convertTo(QImage::Format_RGB888);
    MattingSetBackground(img.bits(), img.height(), img.width(), MATTING_RGB, 0, false);
    
    // 或者使用背景虚化 (二选一)
    MattingActivateBlurMode(0);
    
  2. 调用 setParameters 接口,将 kNERtcKeyEnableVideoCaptureObserver 的值设置为 YES,开启摄像头采集数据的回调。
  • V5.3.0 及之后版本需要执行该步骤。
  • V4.6.X 版本请忽略该步骤。
  1. 在图像数据回调中调用 matting_service
    // IRtcEngineEventHandlerEx::onCaptureVideoFrame 回调接口的处理函数
    void NEEventHandler::mattingService(void* data,
                        NERtcVideoType /*type*/,
                        uint32_t width,
                        uint32_t height,
                        uint32_t count,
                        uint32_t /*offset*/[kNERtcMaxPlaneCount],
                        uint32_t /*stride*/[kNERtcMaxPlaneCount],
                        NERtcVideoRotation /*rotation*/)
    {
        if (width == 0 || height == 0) {
            return;
        }
    
        if (width != m_oldSize.width() || height != m_oldSize.height()) {
            m_oldSize.setWidth(width);
            m_oldSize.setHeight(height);
            m_mask = new unsigned char[width * height * count];
            memset(m_mask, 0, width * height * count);
        }
    
        MattingPredict((unsigned char*)data, m_mask, height, width, MATTING_I420, 0, false);
    }
    
  2. (可选)如果使用 Qt Creator,为保证项目最终的执行文件可以运行,需要添加编译后处理命令。
    1. 打开Qt Creator,点击左侧的 Projects 标签,切换到当前项目的 Build & Run 项。

    2. Build Steps 项目下,点击 Add Build Step

    3. 添加后处理命令。示例如下:

      @echo off
      
      SET thirdparty_path=..\3rdparty\
      SET out_path=..\bin\
      SET nertc_path=%thirdparty_path%nertc_sdk_4.1.1\win\dll\
      
      @REM  x86 version release version
      copy  %thirdparty_path%matting_service\win\x86\bin\*.*   %out_path%x86\release\
      copy  %thirdparty_path%mnn\x86\*.*                       %out_path%x86\release\
      copy  %thirdparty_path%opencv\x86\*.*                    %out_path%x86\release\
      copy  %thirdparty_path%openssl\x86\*.*                   %out_path%x86\release\
      copy  %nertc_path%x86\*.*                                %out_path%x86\release\
      
      windeployqt ../bin/x86/debug/multipersionCallDemo.exe --list mapping --no-quick-import 
      

      最终的效果如下:

API 时序

API 参考

API 说明
MattingInit SDK 初始化。
MattingReset AI 虚拟背景功能状态重置。
MattingSetBackground 设置自定义背景。
MattingActivateBlurMode 激活背景虚化模式。
MattingPredict 开始 AI 背景虚化或背景替换。
此文档是否对你有帮助?
有帮助
去反馈
  • 注意事项
  • 项目结构
  • 环境准备
  • 集成 SDK
  • 前期准备
  • 实现步骤
  • API 时序
  • API 参考