专栏首页字节流动原创:好玩的视频人像抠图

原创:好玩的视频人像抠图

前面文章人像抠图 + OpenGL ES 还能这样玩?没想到吧,我们介绍了利用人像抠图算法生成的 mask 图,然后结合 OpenGL 可以产生一些有趣的效果。

抠图技术应用很广泛,比如很多手机的相机自带“人像留色”滤镜:人体区域保留彩色,人体区域之外灰度化。所以人像留色的关键技术在于高精度高性能的分割算法。

本文将基于开源的人像抠图算法模型和 OpenGL 做一个实时的人像分割 app , 该 app 目前已开源,感兴趣的同学可以参考该项目利用matting算法做一些有趣的特效。

本文主要参考飞鸽传书的开源项目 ncnn_Android_RobustVideoMatting ,它使用的是腾讯的 ncnn 神经网络计算框架,ncnn 是一个为手机端极致优化的高性能神经网络前向计算框架。无第三方依赖,跨平台,手机端 cpu 的速度快于目前所有已知的开源框架。

ncnn 地址:https://github.com/Tencent/ncnn

不过 ncnn_Android_RobustVideoMatting 数据源使用的是 NdkCamera ,这对做应用层开发的同学来说,学习和移植起来很不方便。

所以本文采用 Android Camera2 (Java)获取实时预览图像,将算法模型和 OpenGL 渲染控件封装成一个类,初学者可以很方便地利用这些类进行移植和二次开发,可以轻易实现自己想要的效果。

将算法模型封装成一个类,可以很方便将其移植到你的播放器或者相机里

#ifndef NCNN_ANDROID_ROBUSTVIDEOMATTING_MAIN_BODYSEG_H
#define NCNN_ANDROID_ROBUSTVIDEOMATTING_MAIN_BODYSEG_H
#include <ImageDef.h>
#include <android/looper.h>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc.hpp>
#include <android/asset_manager_jni.h>
#include <android/sensor.h>
#include "LogUtil.h"
#include "nanodet.h"

class BodySeg {
public:
    BodySeg(){}
    ~BodySeg(){}

    void Init(AAssetManager* mgr);

    void SetCameraOrt(int ort);

    void Process(NativeImage *pInput, NativeImage *pOutput, NativeImage *pOutMask);

    void UnInit();

private:
    void LoadModel(AAssetManager* mgr);

private:
    int camera_facing;
    int camera_orientation;
    mutable int accelerometer_orientation;
    ASensorManager* sensor_manager = nullptr;
    mutable ASensorEventQueue* sensor_event_queue = nullptr;
    const ASensor* accelerometer_sensor = nullptr;
    NanoDet* nanoDet = nullptr;
};

模型类封装的非常简单,Process 执行分割输出分割结果和 mask 图。

Java 层获取相机预览数据传入 Native 做分割处理。

    private ImageReader.OnImageAvailableListener mOnPreviewImageAvailableListener = new ImageReader.OnImageAvailableListener() {
        @Override
        public void onImageAvailable(ImageReader reader) {
            Image image = reader.acquireLatestImage();
            if (image != null) {
                if (mCamera2FrameCallback != null) {
                    mCamera2FrameCallback.onPreviewFrame(CameraUtil.YUV_420_888toNV21(image), image.getWidth(), image.getHeight());
                }
                image.close();
            }
        }
    };

Native 层渲染 Matting 结果和 mask 灰度图的类(渲染控件)。

class GLCameraRender: public BaseGLRender {
public:
    //初始化预览帧的宽高
    virtual void Init(AAssetManager* mgr);
    //渲染一帧视频
    virtual void RenderVideoFrame(NativeImage *pImage, NativeImage **ppSegResult);
    virtual void UnInit();

    //GLSurfaceView 的三个回调
    virtual void OnSurfaceCreated();
    virtual void OnSurfaceChanged(int w, int h);
    virtual void OnDrawFrame();

    static GLCameraRender *GetInstance();
    static void ReleaseInstance();

    //更新变换矩阵,Camera预览帧需要进行旋转
    virtual void UpdateMVPMatrix(int angleX, int angleY, float scaleX, float scaleY);

private:
    GLCameraRender();
    virtual ~GLCameraRender();
    bool CreateFrameBufferObj();
    void GetRenderFrameFromFBO();
    ......
};

渲染组件类包含了 GLSurfaceView 的三个回调,主要就是借助于 GLSurfaceView 创建 OpenGL 渲染上下文环境,RenderVideoFrame 传入 matting 结果和相关的 mask 灰度图,然后进行上屏渲染。

-- END --

文章分享自微信公众号:
字节流动

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

作者:字节流动
原始发表时间:2022-03-30
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 【图像分割】还用语义分割抠图?NO,这才是人像抠图的正确打开方式

    要想做好这样的人像抠图,语义分割是远远不够用的。语义分割是对像素进行分类任务,只能获得硬的分割结果,在人像的边缘处无法取得精细结果,更无法处理好人像毛发等细节,...

    用户1508658
  • php实现的证件照换底色功能示例【人像抠图/换背景图】

    砸漏
  • 视频背景抠图:世界是您的绿屏

    是否希望在没有完整工作室的情况下制作专业质量的视频?还是在视频会议期间Zoom的虚拟背景功能效果更好?

    代码医生工作室
  • 抠图,令我苦不堪言!

    剪辑设计吃苦受累,一日三餐时间不对 天天提案让人崩溃,潮流信息必须到位 抠图抠到索然无味,没日没夜也改到位 ...... 有那么一瞬间 你是否为抠图这等事心力...

    腾讯云AI
  • 打工人的「周游世界」,AI算法帮你实现,泪目!

    效果这么稳定的人像 Image Matting算法真的不多,并且还能进行实时处理!

    Jack_Cui
  • 一毛抠图特效不忍直视,以假乱真才是设计界的最高追求!

    曾经有人跟小巴说过这么一句话,剪辑设计吃苦受累,抠图抠到索然无味,提案提到让人崩溃。特别是对于设计公司、影视制作等需要视频剪辑的公司来说,相信很多人都为抠图、抠...

    云巴巴
  • 飞桨PaddleHub带你环游世界,快来试试Python一键视频抠图吧

    在视频创作过程中,有时会遇到人像抠图的需求,最一般的做法是使用PR、AE等工具将视频中的每一帧图像手动抠图。这么繁琐的步骤在理工男面前简直是不可存在的,那么有什...

    用户1386409
  • “你这背景太假了”背后有秘密!

    养蜂十年无人问,却凭一招“背景”享誉全网。 最近新疆一位97年“大叔”,因为直播过程中背景“太假”,火遍全网。面对网友的质疑,“大叔”为了证明自己的背景没有造假...

    腾讯云AI
  • 【新玩法】互联网人五一出行指南!

    以往想要达到足不出户就与各地美景合影留念的目的,只能用传统的软件P图,耗时耗力不说,效果也是因个人技术而定,很难掌握。人像分割技术能够帮你轻松解决以上问题。

    腾讯云AI
  • 谷歌最新抠图算法:让背景虚化细节到头发丝!有单反的感觉了...

    本文经ai新媒体量子位(公众号 id:qbitai)授权转载,转载请联系出处本文约1200字,建议阅读7分钟用上轻量级网络+监督学习。 当真是买算法送手机! 这...

    数据派THU
  • 人像抠图 + OpenGL ES 还能这样玩?没想到吧

    现在人像分割技术就像当初的人脸检测算法一样,称为广泛使用的基础算法。今天本文介绍的人像留色其实就是三年前某 AI 巨头利用 video 分割技术展示的应用场景:...

    字节流动
  • 11——FFmpeg命令行实现视频抠图

    说到抠图,大家第一时间可能想到的是图片,想到的是强大的PS(Photoshop),对于视频而言,也可以实现抠图,使用FFmpeg命令行即可实现这一点。

    视界音你而不同
  • AI自助帮你换背景,超强实时人像扣图算法开源啦!

    谈到人像抠图想必大家都不陌生。在影视剪辑、直播娱乐、线上教学、视频会议等场景中都有人像分割的身影,它可以帮助用户实时、精准地将人物和背景精准识别出来,实现更精细...

    用户1386409
  • 港科大&快手提出首个视频抠图框架!复杂背景下依然优异!CVPR2021

    https://github.com/nowsyn/DVM https://arxiv.org/abs/2104.11208 视频demo链接:https:/...

    AI算法与图像处理
  • 腾讯云AI「开了一个脑洞」

    如果熬夜有段位,你是那一段? 在澎湃新闻一份统计「凌晨3点不睡觉」的搜索报告中显示:一线城市的人担心没有工作,其他城市的人担心没有生活。熬着最深的夜,烦恼的事情...

    腾讯云AI
  • 人像抠图 + OpenGL ES 还能这样玩?没想到吧

    今天本文介绍的人像留色其实就是三年前某 AI 巨头利用 video 分割技术展示的应用场景:人体区域保留彩色,人体区域之外灰度化。所以人像留色的关键技术在于高精...

    字节流动
  • 超强实时人像抠图算法开源,随心所欲背景替换!

    谈到人像抠图想必大家都不陌生。在影视剪辑、直播娱乐、线上教学、视频会议等场景中都有人像分割的身影,它可以帮助用户实时、精准地将人物和背景精准识别出来,实现更精细...

    CV君

扫码关注腾讯云开发者

领取腾讯云代金券