GPUImage源码解读(十六)

在 iOS 中给视频添加滤镜 「众所周知,视频可以 P」,今天我们来学习怎么给视频添加滤镜。 在 iOS 中,对视频进行图像处理一般有两种方式:GPUImage 和 AVFoundation 。 一、GPUImage 在之前的文章中,我们对 GPUImage 已经有了一定的了解。之前一般使用它对摄像头采集的图像数据进行处理,然而,它对本地视频的处理也一样方便。 直接看代码: // movie NSString *path = [[NSBundle mainBundle] pathForResource:@. 阅读详情

GPUImageTextureInput继承自GPUImageOutput,可以用传入的纹理生成帧缓存对象。因此,可以作为响应链源使用。

  • 构造方法。构造方法只有一个,接收的参数是纹理对象和纹理大小
- (id)initWithTexture:(GLuint)newInputTexture size:(CGSize)newTextureSize;
  • 构造的时候,主要是用传入的纹理生成帧缓存对象。
- (id)initWithTexture:(GLuint)newInputTexture size:(CGSize)newTextureSize;
{
    if (!(self = [super init]))
    {
        return nil;
    }

    runSynchronouslyOnVideoProcessingQueue(^{
        [GPUImageContext useImageProcessingContext];
    });

    textureSize = newTextureSize;

    runSynchronouslyOnVideoProcessingQueue(^{
        //分配一个GPUImageFramebuffer,缓存纹理单元的信息
        outputFramebuffer = [[GPUImageFramebuffer alloc] initWithSize:newTextureSize overriddenTexture:newInputTexture];
    });

    return self;
}
  • 其它方法。出去父类的方法,它只提供了一个数据处理的方法
- (void)processTextureWithFrameTime:(CMTime)frameTime;
  • 处理数据的过程就是将帧缓存对象传递给所有targets,驱动所有targets处理。
- (void)processTextureWithFrameTime:(CMTime)frameTime;
{
    runAsynchronouslyOnVideoProcessingQueue(^{
        // 遍历所有targets,驱动各个target处理数据
        for (id<GPUImageInput> currentTarget in targets)
        {
            NSInteger indexOfObject = [targets indexOfObject:currentTarget];
            NSInteger targetTextureIndex = [[targetTextureIndices objectAtIndex:indexOfObject] integerValue];

            [currentTarget setInputSize:textureSize atIndex:targetTextureIndex];
            [currentTarget setInputFramebuffer:outputFramebuffer atIndex:targetTextureIndex];
            [currentTarget newFrameReadyAtTime:frameTime atIndex:targetTextureIndex];
        }
    });
}
YOLO26算法保龄球馆保龄球目标检测+训练好的模型+743张数据集+pyqt可视化界面.zip 数据集可视化效果可参见下方展示。 【数据集概况】 · 检测类别(中文):[保龄球(bowling)] · 训练集:594 张 · 验证集:75 张 · 测试集:74 张 · 总计:743 张 该数据集聚焦于室内保龄球馆场景,系统性采集了多角度、多姿态下保龄球在不同运动阶段的视觉特征,为保龄球运动过程中的球体识别与轨迹分析提供了高质量标注样本,具有明确的体育训练与智能辅助系统开发价值。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 100 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9938** mAP50-95 | 0.6966 Precision | 0.9740 Recall | 0.9974 train/box_loss | 0.9113 train/cls_loss | 0.2862 val/box_loss | 1.1516 val/cls_loss | 0.3116 【训练过程分析】 100 轮训练后 mAP50 达到 0.9938,模型收敛良好。Loss 曲线前段快速下降,后段趋于平稳,val_loss 无反弹,没有明显过拟合。但 mAP50-95 为 0.6966,和 mAP50 差距 0.30,定位精度仍有优化空间。 【模型性能评估】 Precision 0.9740、Recall 0.9974,精召双高,模型对保龄球的检测能力强。 【预测效果展示】 验证集预测效果较好,检测框基本准确覆盖保龄球,置信度整体偏高。 【改进建议】 1. 丰富场景多样性:补充不同光照、背景和遮挡条件下的样本。 2. 提升输入分辨率:640 ... 立即下载

相关推荐

PaddleOCRApi面向 Windows 与 Linux 的轻量级 OCR 与YOLO目标检测 HTTP 服务

PaddleOCR 与YOLO目标检测 HTTP 服务。 项目通过 PaddleOCROnnx 原生库集成 OnnxRuntime加速能力,围绕 ONNX 模型部署, 以统一接口提供图像文字识别、YOLO 目标检测和 Tensor 数据输出。 功能概览 文字识别:支持图片 Base64、multipart/form-data 上传,以及文本和 JSON 结果。 目标检测:支持 YOLO 图片检测,返回检测框 JSON 或原始 Tensor。 浏览器演示:访问服务根地址,上传图片并切换 OCR、YOLO 模式。 健康检查:通过 /health 查看服务及 OCR、YOLO 引擎初始化状态。 并发处理:通过 OCR 引擎实例池处理并发请求,可调整实例数量。 体验与调用 启动后访问: 入口 地址 浏览器演示 http://localhost:5000/ 健康检查 http://localhost:5000/health 原生依赖 Windows:优先从 runtimes/win-x64/native/ 加载原生 DLL;该目录没有 PaddleOCROnnx.dll 时,尝试从可执行文件所在目录加载。主 DLL 与对应后端依赖应放在同一原生目录中,不要将同一组依赖分散到多个目录。 Linux:原生运行时位于 runtimes/linux-x64/native/,程序使用相对于可执行文件的运行时搜索路径查找随包部署的依赖。 后端选择:CoreOCROnnx 支持 ONNX Runtime、OpenVINO、TensorRT 后端。请使用与平台、进程架构、硬件和后端匹配的一整套运行时,不要混用不同后端或版本的依赖。

GPUImage 滤波算法详解

#import "GPUImageFilter.h" #import "GPUImagePicture.h" #import //GPUImage 源码详解 //顶点着色器 //vertex.shader //顶点着色器是一个可编程的处理单元,执行顶点变换、纹理坐标变换、光照、材质等顶点的相关操作,每顶点执行一次。替代了传统渲染管线中顶点变换、光照以及纹理坐标的处理,开发人员可以根据自己的

jeffasd的专栏 2879

GUPImage库的队列管理

最近项目进度不是很紧张,开始研究GUPImage库的源码,发现GUPImage中的队列管理方式设计的很巧妙,值得学习和分享。 在GPUImageOutput.h这个文件,声明了5种不同类型的队列执行方法:void runOnMainQueueWithoutDeadlocking(void (^block)(void)); void runSynchronouslyOnVideoProcessi

lvmaker的专栏 2323

GPUImage的简单使用

GPUImage 是一个开源的图像处理库,提供了非常多的滤镜效果来加工图片。GPUImage 并不像一般的第三方库可以直接拖入到工程中使用,而是需要先在本地编译,然后将编译后的文件拖入到工程中使用。配置步骤如下: (1):首先下载GPUImage https://github.com/BradLarson/GPUImage (2):解压后,在framework 目录下,打开 GPUIm...

weixin_30918415的博客 374

GPUImage教程()安装,使用例子, 原理和内置滤镜列表

第一部分: 安装 一. 安装: Adding the framework to your iOS project 1. 把GPUImage.xcodeproj 拖到你的Xcode project 2. 在app的target依赖设置里面添加GPUImage作为Target Dependency 3. 在build phase的Link Binary With Librari

akka123的专栏 1699

iOS图像处理代码混淆:GPUImage核心算法保护方案

在移动应用开发中,图像处理算法作为核心竞争力,常面临逆向工程与代码盗用风险。GPUImage作为iOS平台广泛使用的开源图像处理框架,其丰富的滤镜算法与高效的GPU加速能力使其成为众多应用的技术基石。然而,框架原生代码结构清晰、类名直白(如`GPUImageBrightnessFilter`),极易被竞争对手解析与复用。本文将从算法定位、混淆策略到实操验证,完整呈现GPUImage核心代码的保护方...

gitblog_00071的博客 379

目录

Weekly 第一期(2017.03.31) iOS App 签名的原理 - by ll 响应链 - by ff iOS10 系统跳转到系统设置 - by lm 深入思考NSNotification - by ak Weekly 第二期(2017.04.07) 使用SDWebImage和YYImage下载高分辨率图,导致内存暴增的解决办法 - by lm iOS圆角避免离屏渲染...

Philm_iOS的博客 570

【Android 美颜相机】第十六天:GPUImageTwoInputFilter 解析

/ 双输入滤镜基类,继承自 GPUImageFilter(单输入滤镜基类)// 顶点着色器源码:负责将顶点坐标、两个纹理坐标传递给片段着色器\n" + // 顶点位置属性(由外部传入)\n" + // 第一个纹理的坐标属性\n" + // 第二个纹理的坐标属性" \n" +\n" + // 传递给片段着色器的第一个纹理坐标(易变变量)\n" + // 传递给片段着色器的第二个纹理坐标" \n" +"void main()\n" + // 顶点着色器主函数"{\n" +

u012739527的博客 866

GPUImage 源码解析

GPUImage 实现链式编程的原理 链式编程的开始,所有的数据源都继承自 GPUImageOutput 链式编程的过程,所有的 filter 都继承自 GPUImageFilter , GPUImageFilter 继承自 GPUImageOutput 并且GPUImageFilter 遵守 GPUImageInput 协议; 所以所有的filter都可以作为输入源和输出; GPUImage...

Coder 501

使用 GPUImage 实现一个简单相机

本文介绍了如何使用 GPUImage 来实现一个简单的相机。具体功能包括拍照、录制视频、多段视频合成、实时美颜、自定义滤镜实现等。 前言 AVFoundation 是苹果提供的用于处理基于时间的媒体数据的一个框架。我们想要实现一个相机,需要从手机摄像头采集数据,离不开这个框架的支持。GPUImage 对 AVFoundation 做了一些封装,使我们的采集工作变得十分简单。 另外,GPUImage...

weixin_33756418的博客 920

IOS技术分享| 在iOS WebRTC 中添加美颜滤镜

在使用WebRTC的时候,对视频进行美颜处理一般有两种方式:替换WebRTC中的采集模块和对视频数据进行美颜。 一、替换WebRTC中的采集模块 替换WebRTC中的采集模块,相对比较简单,使用GPUImageVideoCamera替换WebRTC中的视频采集,得到经过GPUImage添加美颜处理后的图像,发送给WebRTC的OnFrame方法。 参考基于WebRTC框架开发的全平台推拉流SDK:Github 设置美颜 - (void)setBeautyFace:(BOOL)beautyFace{

anyRTC的博客 1199

GPUImage源码解读()

GPUImageVideoCamera继承自GPUImageOutput,实现了 AVCaptureVideoDataOutputSampleBufferDelegate 和 AVCaptureAudioDataOutputSampleBufferDelegate 协议。GPUImageVideoCamera可以调用相机进行视频拍摄,拍摄之后会生成帧缓存对象,我们可以使用GPUImageView显...

Philm_iOS的博客 718

GPUImage源码解读()

介绍GPUImage框架中的GPUImageInput协议以及GPUImageOutput类 GPUImageInput GPUImageInput 在GPUImageContext.h中定义, 协议提供了方法列表,细节由实现的对象实现。GPUImage中实现GPUImageInput的协议的类比较多,常见的有 GPUImageFilter、GPUImageView、GPUImageRa...

Philm_iOS的博客 536

GPUImage源码解读()

GPUImageFramebuffer类用于管理帧缓冲对象,负责帧缓冲对象的创建和销毁,读取帧缓冲内容,其中纹理附件涉及到了相关的纹理选项。因此,它提供的属性也是和帧缓存、纹理附件、纹理选项等相关。 ###### 属性 // 帧缓存大小 @property(readonly) CGSize size; // 纹理选项 @property(readonly) GPUTextureOpti...

Philm_iOS的博客 518

GPUImage详细解析- 实时美颜滤镜

解析(一)解析(二) GPUImageFilter就是用来接收源图像,通过自定义的顶点、片元着色器来渲染新的图像,并在绘制完成后通知响应链的下一个对象。 GPUImageFramebuffer就是用来管理纹理缓存的格式与读写帧缓存的buffer。 GPUImageVideoCamera是GPUImageOutput的子类,提供来自摄像头的图像数据作为源数据,一般是响应链的源头。 GPUImageView是响应链的终点,一般用于显示GPUImage的图像。 琨君的基于GPUImage的实时美颜滤镜对G

翻肚鱼儿的博客 1605

GPUImage源码解读(十四)

GPUImageRawDataInput继承自GPUImageOutput,它可以接受RawData输入(包括:RGB、RGBA、BGRA、LUMINANCE数据)并生成帧缓存对象。 - 构造方法。构造的时候主要是根据RawData数据指针,数据大小,以及数据格式进行构造。 // Initialization and teardown - (id)initWithBytes:(GLubyt...

Philm_iOS的博客 369
上一篇: GPUImage源码解读(十五)
下一篇: GPUImage源码解读(十七)
Philm_iOS
博客等级 码龄8年 74粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值