V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
devzhaoyou
V2EX  ›  分享创造

🏂开源个自己开发的 C++跨平台美颜滤镜库,方便集成为直播和 WebRTC 等提供美颜能力

  •  4
     
  •   devzhaoyou ·
    gezhaoyou · 105 天前 · 1603 次点击
    这是一个创建于 105 天前的主题,其中的信息可能已经有所发展或是发生改变。

    王婆卖下瓜

    这个项目是也有参考了很多开源项目,借鉴了他们的架构和数据处理流程。将有用的功能做了缝合,基于 C++ 开发,性能是非常强的💪🏻,比 GPUimage 还要好一丢丢, 并且支持安卓, iOS 和 Mac 。Win 端和鸿蒙未来也计划支持一下。

    调用非常简单,Readme 中有示例,很容为直播和视频通信场景添加美颜和滤镜效果。 个人的第一个做的比较认真的项目,库稳定性和效果已经大量用户(万级别)验证,用到的朋友可以尝试一下,希望大家多多支持,给个 Star👏😬

    👉项目地址:https://github.com/pixpark/gpupixel

    以下为项目 Readme:


    English  |  简体中文  

    GPUPixel @ PixPark

    GitHub Stars Release Static Badge GitHub

    简介

    GPUPixel 是一个高性能的图像和视频处理库,用 C++11 编写。非常容易编译和集成,库的大小非常小。

    它基于 GPU ,并且内置了可以达到商业级效果的美颜效果滤镜。

    它支持包括 iOS 、Mac 、Android 在内的各种平台,并且理论上可以移植到任何支持 OpenGL/ES 的平台。

    当前人脸关键点检测使用了 Face++ 库,但将来将会用 VNN 替代。

    效果预览

    美白 & 磨皮:

    sample.jpg

    Pipeline

    arch.jpg

    功能对比

    This table compares the features supported by GPUPixel and GPUImage:

    ✅: 支持

    ❌: 不支持

    ✏️: 计划中

    GPUPixel GPUImage
    Filters:
    磨皮
    美白
    瘦脸
    大眼
    口红
    腮红
    自定义滤镜
    输入格式:
    YUV420P(I420)
    RGBA
    JPEG
    PNG
    NV21(for Android) ✏️
    输出格式:
    RGBA
    YUV420P(I420) ✏️
    系统支持:
    iOS
    Mac
    Android
    Win ✏️
    Linux

    系统要求

    OS iOS OSX Android Windows Linux
    Min Support OS Version 10.0 10.13 5.0 (API 21) - -

    性能

    iPhone

    - iPhone 6P iPhone 8 iPhone X iPhone 11 iPhone 14 pro
    CPU 5% 5% 3% 3% 3%
    Time Taken 10ms 4ms 3ms 3ms 3ms

    Android

    - Xiaomi 10 Huawei Meta30 Vivo SAMSUNG Google Pixel
    CPU 3% 5% - - -
    Time Taken 6ms 5ms - - -

    编译

    iOS

    Open objc/gpupixel.xcodeproj or objc/demo/PixDemo.xcodeproj Xcode project and select the corresponding platform for compilation

    Android

    Open the directory ./android in Android Studio and configure NDK r21+

    库体积

    iOS(.framework) MacOS(.framework) Android(.aar)
    Size 2.4 MB 2.6 MB 2.1 MB

    调用

    Refer to ./objc/demo or ./android demo

    .h file

    // video data input
    std::shared_ptr<SourceRawDataInput> source_raw_input_;
    // beauty filter
    std::shared_ptr<FaceBeautyFilter> face_beauty_filter_;
    // video data output 
    std::shared_ptr<TargetRawDataOutput> target_raw_output_;
    

    Create Filter, .c++ file

     GPUPixel::GPUPixelContext::getInstance()->runSync([&] {
        // Create filter
        source_raw_input_ = SourceRawDataInput::create();
        target_raw_output_ = TargetRawDataOutput::create();
        // Face Beauty Filter
        face_beauty_filter_ = FaceBeautyFilter::create();
        
        // Add filter
        source_raw_input_->addTarget(face_beauty_filter_)->addTarget(target_raw_output_);
     }
    

    Input Image Data I420 or RGBA

    // ...
    // YUVI420
     source_raw_input_->uploadBytes(width,
                                    height, 
                                    bufferY,
                                    strideY, 
                                    bufferU, 
                                    strideU,
                                    bufferV, 
                                    strideV);
    // ...
    // bytes: RGBA data
     source_raw_input_->uploadBytes(bytes,
                                    width, 
                                    height, 
                                    stride);
    

    Output Data Callback

    // I420 callback
    target_raw_output_->setI420Callbck([=](const uint8_t *data, 
                                            int width, 
                                            int height, 
                                            int64_t ts) {
        size_t y_size = width * height;
        const uint8_t *uData = data + y_size;
        const uint8_t *vData = data + y_size + y_size / 4;
        // Do something you want
    });
    
    // RGBA callback->
    target_raw_output_->setPixelsCallbck([=](const uint8_t *data, 
                                            int width, 
                                            int height, 
                                            int64_t ts) {
        size_t rgba_size = width * height*4;
        // Do something you want
    });
    
    // Output data callbck
    

    Star History

    Star History Chart

    11 条回复    2024-01-14 20:45:44 +08:00
    chancat
        1
    chancat  
       104 天前 via Android
    牛哇,op.
    guotie
        2
    guotie  
       104 天前
    大佬
    lizhenda
        3
    lizhenda  
       104 天前
    厉害哦,star 了,后面看是否用得上
    Seawalker
        4
    Seawalker  
       104 天前 via Android
    性能消耗怎么样,cpu 、gpu
    bihui
        5
    bihui  
       104 天前
    有没有可以翘臀丰胸的
    coreki
        6
    coreki  
       104 天前
    这个厉害
    devzhaoyou
        7
    devzhaoyou  
    OP
       104 天前
    @bihui 配合关键点识别库,理论上都是可以做的
    devzhaoyou
        8
    devzhaoyou  
    OP
       104 天前
    @lizhenda 感谢支持👏
    devzhaoyou
        9
    devzhaoyou  
    OP
       104 天前
    @Seawalker 刨去人脸识别,图像处理消耗很小,参考 Readme 中性能章节🍻
    waylife
        10
    waylife  
       104 天前
    真大佬
    bihui
        11
    bihui  
       104 天前
    niubi
    star 了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1001 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 18:57 · PVG 02:57 · LAX 11:57 · JFK 14:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.