GPUImage的图像形变设计(简单形变部分)

ITK库---GPU类梳理: GPU类梳理: 1.核心GPU并行: 1)GPU公共类: 基于GPU的核管理器:itk::GPUKernelManager使用OpenCL实现的GPU内核管理器,此类负责管理GPU内核和命令队列。 基于GPU的上下文管理器:itk::GPUContextManager 基于GPU的数据管理器:itk::GPUDataManager 使用OpenCL实现GPU内存管理,是GPUImage类必须; GPUFunctor图像滤波的基本Functor类:itk::GPUFunctorBase;其中 阅读详情

GPUImage是iOS平台主流的GPU图像处理框架,能够非常方便地使用GPU对图像进行处理,包括:滤镜、分布统计等。

我们知道,如果需要对一个图像进行滤镜处理,一般而言只需要设计FragmentShader即可以达到目的。比如:需要对图像进行亮度调节,仅需要FragmentShader中对像素点的颜色值进行修改即可,并不需要自定义VertexShader。

那么,能否基于GPUImage进行一定的形变处理呢?答案是肯定的。对于形变的处理,可以是基于FragmentShader的,也可以是基于VertexShader的,也可以通过自定义顶点vertices和textureCoordinates来实现。下面会分别介绍一下如何通过设计来实现基于GPUImage的图像形变。

Part1:基于FragmentShader的图像形变设计

其实,有一部分形变是可以基于FragmentShader去实现的。直观的比如:翻转、旋转、压缩等。下面举几个具体的示例和相应FragmentShader的实现。

这里写图片描述

1. 翻转

为了实现翻转,只需要简单的将textureCoordinate的x、y值进行相应的改变即可:

vec2 newTex = vec2(1.0 – textureCoordinate.x, textureCoordinate.y); //代表水平翻转vec2 newTex = vec2(textureCoordinate.x, 1.0 – textureCoordinate.y); //代表垂直翻转vec2 newTex = vec2(1.0 – textureCoordinate.x, 1.0 - textureCoordinate.y); //代表水平+垂直翻转
2. 旋转
vec2 newTex = vec2(textureCoordinate.y, 1.0 - textureCoordinate.x);  //代表向右旋转90度

3. 压缩

vec2 newTex = vec2(textureCoordinate.x * 2.0 – 0.5, textureCoordinate.y * 2.0 – 0.5);

代表将图像缩小到原来的1/2长和宽,并居住

4. 变平行四边形
vec2 newTex = vec2(textureCoordinate.x * 2.0 + textureCoordinate.y – 1.0, textureCoordinate.y);
5. 大眼

相比于之前的几种形变,大眼的操作就相对比较复杂了。这里假设奥巴马右眼(图中左眼)中心的坐标是(x0, y0),放大范围的半径为r,则:

vec2 center = vec2(x0, y0);
vec2 newTex = textureCoordinate.xy;float dist = sqrt((center.x – newTex.x)* (center.x – newTex.x) + (center.y – newTex.y)* (center.y – newTex.y));if (dist < r){
         float ratio = sqrt(dist / r);
         float x1 = center.x – (center.x – newTex.x) * ratio;
         float y1 = center.y – (center.y – newTex.y) * ratio;
         newTex = vec2(x1, y1);
}

具体思想是:对于中心(x0,y0)半径r中的点,做一个偏移的调整,使得整体偏移值更大(ratio<1,所以相比正常情况,会取离(x0,y0)点更近的图中的点,从而实现眼睛的“放大”)

需要特别注意的一点是,对于通过FragmentShader进行形变处理时,如果形变后的图像有像素缺失(即:形变后图像小于旧的图像),需要对多出来的点有一个特殊赋值,否则就会出现下面的情况:

这里写图片描述

如上图所示,如果不设置超出画面像素的填充颜色,则会将最外层的像素重复填充(主观感受是线条拉伸),当然,也可以设置Texture Wrapping Mode为GL_REPEAT来平铺填充(重复画面)。不过,一般而言,还是设置超出屏幕部分为纯色底图(纯白、纯黑)比较合适~

小结一下:

基于FragmentShader的图像形变设计,主要是基于坐标点的x,y的简单变换得到的,适合于旋转、翻转、缩放、一些规则四边形变形等情况。对与复杂的形变,比如大眼,就需要设计较为复杂的Shader来实现。由于每个像素点都需要进行一次FragmentShader的计算,因此复杂形变处理时,需要的GPU计算量更大。

Part2:基于自定义vertices的图像形变设计

对于Part1中举例的简单形变而言,通过巧妙的传递顶点坐标,可以实现在使用默认Shader的情况下的图像形变。具体示例如下:
这里写图片描述

对于GPUImage而言,默认的顶点如左上角的A、B、C、D点所示。我们只需要调整这4个实际渲染顶点的位置(vertices),即可以轻松实现简单形变。代码如下:

在- (void)renderToTextureWithVertices:(const GLfloat )vertices textureCoordinates:(const GLfloat )textureCoordinates函数中,修改如下:

//不使用默认的顶点//默认的vertices: {-1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0}//glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, vertices);       GLfloat meshVertices[8] = {1.0, -1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0};
glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, &meshVertices[0]);

这样就实现了水平翻转。同理可以实现旋转、压缩等。

小结一下:

通过自定义顶点的方式,可以在不改变默认fragmentShader和vertexShader的情况下,轻松实现简单的形变。然而,对于局部形变(比如大眼),就没有这么轻松了。

那么,如何实现复杂形变呢?我们会在“基于GPUImage的图像形变设计(复杂形变部分)”再做介绍~

iPad图像美化应用开发实战项目 实现一个交互式裁剪框,需要处理用户手势(如拖动、缩放、旋转)以及裁剪区域的绘制与更新。didSet {// 绘制裁剪框) {// 开始拖动裁剪框) {// 更新裁剪框位置若需实现更复杂的色彩调整逻辑,可通过自定义CIKernel实现:""")该自定义滤镜实现了曝光、对比度和饱和度的综合调整,适合集成到图像处理流水线中。人脸美容功能是图像处理应用中最具挑战性的模块之一,涉及到图像识别、算法优化、性能控制等多个方面。 阅读详情

相关推荐

iOS-GPUImage框架:实现多样图像处理与滤镜效果

GPUImage是一个功能强大的图像和视频处理库,它让开发者可以在iOS和Android平台上快速应用复杂的滤镜和图像处理算法。利用GPU加速计算,GPUImage不仅可以实时处理视频流,还能轻松集成到各种图像和视频相关的应用中。GPUImgDemo 是一个展示 GPUImage 框架实际应用的示例项目,它不仅包含了多种滤镜效果的实现,还演示了如何将 GPUImage 集成到真实的应用程序中。项目整体结构清晰,旨在帮助开发者快速理解 GPUImage 的使用方法,并在自己的应用中实现类似的功能。

weixin_33610780的博客 1420

GPUImage源码分析与使用(一)

有丰富的输入组件,可以处理图片、纹理、视频、二进制数据、UIElement(UIView、CALayer),可以使用GPUImage拍照、处理纹理图片、给视频或拍摄中的视频添加滤镜、添加水印可以使用UIElement。支持对大图进行处理,GPU的纹理限制是4096*4096,对于超出限制的图片,GPUImage会压缩处理导致损失图片质量,CoreImage会把图片拆解成小图处理。可以传入字符串类型,也可以传入文件类型,比如以.vsh/.fsh/.glsl等为后缀等命名的文件。

程序猿老樊的博客 1123

基于 AUTOSAR 的域控产品软件开发进阶探索

本文深入探讨了AUTOSAR架构在汽车域控产品开发中的进阶应用。首先从系统设计角度分析了AUTOSAR分层架构原理及其在域控产品中的优化部署策略;其次详细介绍了Davinci和EBTresos等主流工具链的特点与协同使用方法;然后重点阐述了ASPICE流程与功能安全/信息安全标准的实施要点;最后分享了多核车载芯片(如NXP S32G)的适配经验与优化实践。通过架构设计、工具运用、标准遵循和芯片适配四个维度的专业解析,为域控产品的AUTOSAR开发提供了系统性指导。

SiArch的博客 1199

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

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

翻肚鱼儿的博客 1608

Qt C++实现HTTP/HTTPS服务器与客户端:从Socket到协议解析全流程

HTTP协议作为Web通信的基础,定义了客户端与服务器之间基于文本的请求-响应模型。其工作原理是通过TCP连接传输结构化的报文,实现资源获取与数据交换。在C++开发中,掌握HTTP协议底层实现具有重要技术价值,能够帮助开发者构建高性能、可深度定制的网络应用,尤其适用于嵌入式设备管理、桌面应用后端等场景。本文聚焦于使用Qt框架的QTcpSocket和QSslSocket组件,从Socket层面手动实现完整的HTTP/HTTPS通信栈,涵盖协议解析、流式处理、路由分发等核心环节,并深入探讨了HTTPS证书验证、

weixin_31292729的博客 330

免费,Python蓝桥杯等级考试真题--第10级(含答案解析和代码)

Python中蓝桥杯算是含金量和难度最大的比赛之一,网上可以找到不少真题,不过要么零零散散要么付费才能解锁,而且大都是没答案和解析的,给学习者造成很大困扰。因此本文档打算整理历年等级考试、STEMA、省赛、国赛真题卷和解析,供大家学习参考。

1576

OpenGL之GPUImage源码分析

在相机数据采集中,还有一些小的细节问题,比如相机前置与后置摄像头的左右镜像翻转问题。在前面讲到过,GPUImage 的纹理坐标原点是位于左上角的,所以使用 TEXTURE_NO_ROTATION 的纹理坐标实质上是将图像进行了上下翻转,两次调用TEXTURE_NO_ROTATION纹理坐标时,又将图像复原了,这也就可以解释为什么滤镜个数为偶数时,需要使用 mGLTextureFlipBuffer 纹理坐标将图像再进行一次翻转,而 mGLTextureBuffer 纹理坐标不需要了。

程序猿老樊的博客 776

农经权二轮延包—地块示意图生成

本文介绍了地块示意图制作软件的使用方法及模板制作要点。软件通过设置六个参数(示意图模板、属性数据、地块DBF、导航图、地块图片及存放位置)自动生成Word文档,并可导出PDF。文章详细说明了5页Word模板的制作过程,包括页脚三栏设置和页码插入技巧,支持每户最多28个地块的情况。同时指出该软件生成的图片分辨率(300dpi)满足清晰度要求,并提及软件免费提供插件但收费提供后续服务。

weixin_47364423的博客 1114

最优秀的开源库之GPUImage

我们都知道对于视频的采集,IOS提供了 AVFoundtion 库,这个库非常强大,可以做很多事情。但如果我们要对里边的每个函数都仔细的过一遍的话还是要花不少时间的,而且还可能有很多坑在等着我们。是否有这方面比较好的开源库呢?这样我们不就轻松的跳过了这些坑了吗?于是我发现了GPUImage库。

garrylea的博客 7472

告别CNN局限:用Transformer+迁移学习搞定高光谱图像分类(附Pytorch代码)

本文探讨了如何利用Transformer的自注意力机制和迁移学习策略解决高光谱图像分类中的挑战。通过结合CNN的局部特征提取和Transformer的全局建模能力,提出的DenseTransformer架构在多个数据集上实现了显著的性能提升。文章还提供了详细的PyTorch实现代码和工程优化技巧,帮助开发者快速应用这一技术。

weixin_32771907的博客 604

气象水文资料预处理:缺测数据插补延长等

简介气象水文资料预处理

WW、forever的博客 3769

GPUImage框架使用

它是GPUImage框架的帧缓存管理器,可以创建、存储和管理多个帧缓存对象,并且可以在需要时快速地获取和释放帧缓存。它是所有输出对象的基类,定义了输出源应该具有的基本方法,例如获取处理后的纹理、获取处理后的图片、获取处理后的视频等。它是所有帧缓存对象的基类,保存了一个纹理对象和一些其他的数据,可以在需要时输出到屏幕或其他帧缓存中。它是所有输入对象的基类,定义了输入源应该具有的基本方法,例如需要处理的图像、需要处理的纹理等。它是所有滤镜对象的基类,定义了滤镜应该具有的基本方法,例如设置输入纹理、处理纹理等。

woaimx_1314的博客 776

基于卷积神经网络的球罐结构损伤识别

球罐结构损伤识别方法研究 摘要:本研究针对球形储罐(球罐)结构健康监测需求,提出基于卷积神经网络(CNN)的损伤识别方法。通过ANSYS有限元仿真构建包含5种裂纹深度的500组振动信号数据集,设计包含卷积层、池化层和全连接层的CNN网络架构。实验结果表明,该方法在训练集和测试集上分别达到98.4%和96.0%的准确率,验证了其在球罐焊缝损伤识别中的有效性。研究提供了完整的MATLAB实现代码,为球罐结构智能化监测提供了技术参考。 关键词:球罐结构;卷积神经网络;损伤识别;振动信号;深度学习

AI的内部世界的博客 120

GPUImage的图像形变设计(复杂形变部分)

在上一部分,我们介绍了两种简单形变的GPUImage实现方式,包括自定义FragmentShader,和自定义顶点数组。这一部分,我们将介绍更为复杂的一些图像形变的实现。 Part3:基于自定义vertices的局部图像形变设计 区别于Part2中的自定义vertices和fragment数组的简单图像形变,这里的自定义vertices数组不仅仅局限于图像4个顶点,而是可以任意指定的,从而可以达到对图像的局部区域进行细微的形变调整。这里,我们以调整用户的脸型,从而达到蛇精脸的效果为例,如下图所示: .

翻肚鱼儿的博客 494

Claude Code 新手安装指南,手把手教你怎么安装使用

如果你是企业内网用户,或者需要自定义 API 端点,那可以用手动配置 API Key 的方式。

篮球界最会写bug的人;程序猿中打球最菜的人。 485

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

GPUImage开源框架使用教程

GPUImage是个功能十分强大、又十分易用的图像处理库。提供各种各样的图像处理滤镜,并且支持照相机和摄像机的实时滤镜。GPUImage顾 名思义,是基于GPU的图像加速,所以图像处理速度十分快,并且能够自定义图像滤镜。支持ARC。 https://github.com/BradLarson/GPUImage 使用教程: 1.添加框架 2.搜索 other

沐阳的博客 5285

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

目录

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的博客 576

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SwiftOCR训练指南:如何为自定义字体训练神经网络

SwiftOCR是一个基于Swift语言开发的快速简单OCR库,专门用于识别短文本和字母数字代码。本文将详细介绍如何为自定义字体训练SwiftOCR的神经网络,让你能够轻松处理特定字体的识别需求。🎯 SwiftOCR采用神经网络进行图像识别,特别适合识别短文本和字母数字代码。相比传统的Tesseract,SwiftOCR在速度和准确性方面都有显著优势,特别是在识别自定义字体时表现更为出色。

gitblog_00155的博客 908

【亲测免费】 推荐GPUImage for Android:跨平台图像处理框架的绝佳选择

推荐GPUImage for Android:跨平台图像处理框架的绝佳选择 在Android开发中,实时图片处理和滤镜应用是常见的需求,而GPUImage for Android就是这样一款能帮助您实现这些功能的强大开源库。它是基于iOS上的GPUImage框架移植而来的,充分利用了GPU的并行计算能力,提供了高效且性能优化的图像处理解决方案。 1、项目介绍 GPUImage for Androi...

gitblog_00005的博客 752

GPUImage

概念:GPUImage是基于GUP图像和视频处理的开源iOS框架,支持多种图片处理滤镜,基于GPU的图像加速,所以支持照相机、摄像机的实时滤镜处理。 首先了解GPUImage的几个基本的概念: - input 输入源 - ouput 输出源 - filter 滤镜 处理流程:GPUImageFilter是GPUImage里面重要的一个类,GPUImageFilter和响应链的其他元素实现了...

qq_18951479的博客 2093

iOS:GPUImage 简介及滤镜

GPUImage 是一个开元的基于 GPU 的图片或视频的处理框架,其本身内置了多达 120 多种常见的滤镜效果,并且支持照相机和摄像机的实时滤镜,并且能够自定义图像滤镜。 美颜的基本概念 OpenGL ES: 开源嵌入式系统图形的处理框架,一套图形与硬件接口,创造了软件与图形加速间灵活强大的底层交互接口。用于把处理好的图片显示到屏幕上。 GPU: (图形处理单元)手机或者电脑用于图像处理和渲染的...

GSNICE 2568

GPUImage 的简单说明

#import "GLProgram.h" // Base classes #import "GPUImageOpenGLESContext.h" #import "GPUImageOutput.h" #import "GPUImageView.h" #import "GPUImageVideoCamera.h" #import "GPUImageStillCamera.h" #

xiaota00的博客 1781

【亲测免费】 GPUImage for Android:开启移动端图像处理新篇章

GPUImage for Android:开启移动端图像处理新篇章 在移动应用开发领域,图像处理一直是开发者关注的焦点。今天,我们向您隆重推荐一款强大的开源项目——GPUImage for Android,它将为您带来前所未有的图像处理体验。 项目介绍 GPUImage for Android 是一款基于 OpenGL ES 2.0 的图像处理库,旨在为 Android 开发者提供与 iOS GP...

gitblog_01035的博客 1310
上一篇: iOS响应式架构
下一篇: 过渡动画
Philm_iOS
博客等级 码龄8年 74粉丝 53原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值