让摄像更好玩——浅谈图形图像处理

图像的本质

数字化图像本质上是一个像素矩阵,如果我们把一个像素看做图论当中的一个概念“顶点”(vertex),把相邻的两个像素的色彩接近程度或特征量距离定义为一个量化数值而构成两个像素顶点间的连接边(edge)的话,这些边和顶点的集合就定义了数学上的一个“图”(graph)。通过图的邻接矩阵就可以描述图,图像的变化就可以通过矩阵的变换来实现。


离散数学中图与邻接矩阵

图像处理的方式

通过上面的概念可知,图像处理最直接的实现方式就是:
1. 改变图像的像素值。
2. 改变图像的像素位置。
像有笔和画布就可以绘画一样,涂鸦是不难的,难的是你能否画出蒙娜丽莎。图像处理的底层原理是不复杂的,复杂的是处理后是否是满足要求的图像和对处理过程的抽象。说的更直白一点,对像素值和像素位置的矩阵变换,方便计算机计算,但是不方便人的理解。

OpenGL介绍

OpenGL规范描述了绘制2D和3D图形的抽象API,用于渲染2D、3D图形。提供了标准的图像处理与渲染接口,方便使用和理解。手机当前在图像显示渲染上通用这个。只不过嵌入式设备使用的OpenGL ES1.x可以由硬件GPU支持或用软件模拟实现(可以运行在CPU上),而OpenGL ES2.0及以上的版本采用的是可编程渲染管线,渲染能力大大提高,但必须由GPU提供支持。

形状和色彩

学习画画的时候,老师会教我们先素描出物体的形状,然后着色。OpenGL用面来描述物体的形状,用片元描述物体的色彩。其实这与现实世界搭建建筑物没有本质区别。现实世界的建筑物远看是平滑的曲面,其实近看是由一个个小平面组成的。小平面分得越小,越细致,搭建出来的物体就越平滑。主体成形后,再涂上涂料,最后呈现的就是漂亮的建筑物。所以OpenGL这样抽象更符合现实,更接近使用自然语言描述。

image.png

在OpenGL中,物体的形状通过光栅化后变成片元,对片元可以进行色彩操作。32位的真色系统就是ARGB8888,使用一个32位int值可以表示所有的色彩,但人是没有办法感知的,调色也不方便 。就有了数字色彩的概念,是由能被计算机测量和计算的基本属性来定义的,这些属性有很多,最常见的基本属性是色相、饱和度和亮度。

纹理

如果渲染场景中物体的色彩都是通过属性调节得到会令人兴味索然,无聊到爆,并且现实世界是绚丽多彩的,更是加深了调节难度,使用纹理可以解决这个问题。如果想把一张纹理映射到相应的几何图元,就必须告诉渲染系统如何进行纹理的映射和采样。纹理的映射方式是图元中顶点指定恰当的纹理坐标。所谓纹理采样就是根据片元的纹理坐标到纹理图中提取对应位置颜色的过程。由于被渲染图元中的片元数量与其对应纹理区域中像素的数量并不一定相同,也就是说图元中的片元与纹理图中的像素并不总是一一对应。这就需要采样策略,最常见的是最近点采样和线性采样。最近点采样是直接取片元纹理坐标对应纹理区域中最近点的颜色值。最近点采样会有锯齿。线性采样其结果颜色并不一定仅来自于纹理图中的一个像素,其在采样时会考虑片元对应的纹理坐标点附近的几个像素。通过加权求平均计算出最终的采样结果。不会有锯齿现象,是平滑过渡的,但是线条边缘会模糊。

两种采样的原理图和对比图

渲染方式

OpenGL提供的抽象对像素值和位置的改变处理方式是统一的,位置是空间域(x,y,z),像素是色域(r,g,b),对数学来说,他们只是不同的变量和不同的映射方法,从问题空间到解空间研究方法没有改变。OpenGL通过可编程渲染管线绘制的方式对图像进行处理,如下图:

OpenGL渲染架构图

其中Vertex Shader和Fragment Shader支持可编程,能渲染更加逼真、可定制化的场景。

相机应用AR介绍

市面上大多的AR应用都是分层设计的,设计架构图如下:

AR分层渲染

此类体感玩法应用最核心的技术是动作、表情、环境检测、3D物体构建和渲染。产品设计避免同质化设计内容,升级相机的创意设计,灵活运用设计元素和体感玩法,让体验更好。

ARcore介绍

ARCore 是 Google 的增强现实体验构建平台。 ARCore 利用不同的 API 让手机能够感知其环境、了解现实世界并与信息进行交互。 提供AR 体验的现实世界的信息支撑。

ARCore 使用三个主要功能将虚拟内容与通过手机摄像头看到的现实世界整合:

  • 运动跟踪让手机可以理解和跟踪它相对于现实世界的位置。
  • 环境理解让手机可以检测各类表面(例如地面、咖啡桌或墙壁等水平、垂直和倾斜表面)的大小和位置。
  • 光照估计让手机可以估测环境当前的光照条件。

OpenGL在AR中的应用

OpenGL主要完成相机预览数据的二次处理、3D道具的构建、2D纹理的混合、光效、粒子特效、滤镜等图像处理。创建FBO绑定MediaCodec实现视频的录制。实现原理如下:

1.创建GPU SurfaceTexture收到相机的预览数据,当作二次处理的原始数据。
2.创建 CPU Surface收到相机的预览数据,用于关键信息检测。
3.基于CNN检测人脸信息,做美颜美妆算法处理。
4.基于ARcore检测平面、肢体动作、表情信息,生成动作驱动数据。
5.加载3D obj文件,生成3D道具。
6.根据人脸、肢体、表情、平面等关键信息,确定3D道具的位置、大小、方向,渲染3D道具。(一帧帧渲染,只要位置、大小、方向不同,就会产生3D道具表情或肢体运动效果)。
7.加入光效、粒子特效、滤镜等效果。
8.绑定MediaCodec,实现视频录制。实现方法是OpenGL渲染的目标地变成MediaCodec的Surface。


流程图.png

图像处理的发展看法

  1. 相机作为影像采集系统,API2给用户提供了更多影像数据通道,可以并行的做多种算法,算法叠加会成为一种趋势。
  2. 提升AR类应用体感玩法,让体验更好。对算法精确性、复杂度有较高的需求,特别是面对算力不强的嵌入式设备。
  3. 以前大部分图像处理都是在跑在CPU上,现在越来越多的跑在GPU上了,包括相机、视频、游戏这几类用户最关注的手机应用,所以手机上GPU图像处理越来越重要。
  4. 从文字、图片、语音、视频信息媒介发展趋势来看,音视频会是主要的信息传输和记录媒介,音视频的压缩存储、检索、传输、编解码技术会是一个方向。
  5. 像学习数学一样,研究一个运算,后面大概率会研究它的逆运算,例如微分与积分。如果未来存储的都是被处理后的图像,原片会有需求,复原处理也会成了一个方向。

你可能感兴趣的:(让摄像更好玩——浅谈图形图像处理)