【米尔瑞萨RZ/G2L开发板-创新应用】-在YG2LX上实现哈哈镜开发
本帖最后由 ALSET 于 2023-10-13 08:53 编辑【米尔瑞萨RZ/G2L开发板-创新应用】在YG2LX上是使用GPU开发哈哈魔镜大信(QQ:8125036)一、应用背景介绍魔镜啊魔镜,谁是世界上最美丽的女人?在《白雪公主》里的王后她有一面从神奇的镜子,她都会问魔镜:谁是这个世界上最美丽的女人,魔镜总是毫不犹豫的回答她:“是你,我的女王。”看来这个魔镜确实有非凡的魔力,能让人开心大笑。这么神奇镜子除了在童话里有,而现实中会不会又呢?答案是有的,只不过这个魔镜让你在这个镜子前,那恐怕就不是最美的人了,而是变的奇形古怪的样子,是一个让人哈哈大笑的哈哈镜。比如这样:
哈哈镜通过对反射镜或透射镜进行曲面设计和镜面表面加工,使得经过反射或透射的光线发生弯曲、变形和扭曲,使得图像发生畸变,从而营造出一种搞笑、滑稽的效果。哈哈镜通常被用于游乐场、娱乐场所等场合,作为一种娱乐和放松的方。使得人们在镜中看到的自己的形象变得非常怪异和滑稽。常见的哈哈镜类型包括凹面镜、凸面镜、扭曲镜等。而这里我们将使用MYD-YG2L开发板上的GPU来来实现对图片照片进行哈哈镜效果的处理。并且结合USB摄像头完成对拍摄的图片进行哈哈镜效果的开发。二、技术硬件方案项目采用MYD-YG2L为主控板,使用800万像素4K级广角USB相机镜头,通过拍摄画面,在开发板内使用GPU快速的完成画面畸变的处理,通过HDMI输出显示生成的图像。 这里使用开发板连接HDMI显示器和接入一个4K高清镜头,主要硬件连接如下图:
三、实现技术原理哈哈镜实际上就是凹面镜和凸面镜的组合,凹面镜会把镜像缩小,凸面镜会把镜像放大,从而达到失真的效果.并且,哈哈镜成像特点是平面镜成像,光的反射,成的是虚像.球内集焦,能让人变短或者变胖,球外扩散,能使人变长,变大。凸透镜的成像原理是:物体放在焦点之外,在凸透镜另一侧成倒立的实像,实像有缩小、等大、放大三种。物距越小,像距越大,实像越大。在2倍焦距上时会成等大倒立的实像。物体放在焦点之内,在凸透镜同侧成正立放大的虚像。物距越大,像距越大,虚像越大。在焦点上不会成像。在光学中,由实际光线汇聚成的像,称为实像,能用光屏承接反之,则称为虚像,只能由眼睛感觉。相对原物体而言,实像都是倒立的,而虚像都是正立的。程序处理方式很简单,主要分成三步:1. 读取图片文件或者摄像头画面数据2. 对图片进行各种算法下的畸变变形3. 显示图片和保存新的图片其中畸变算法以凸透镜或者凹面镜为例:凸透镜放大效果的基本原理是图像的中心区域呈现类似凸透镜效果。简单来说就是变形后的图像的像素点位置映射到原有的图像上时,要更加靠近中心区域, 其算法原理如下。假设输入图像的宽高为w,h,图像中心点O的坐标(cx,cy),可知满足如下关系:
则经过曲面镜转化后的图像宽高不变,因此上述对于原图像和转化后的图像都是满足的。那么变换后的图像中任意一点(x’, y’)到中心点的距离为:
设拉伸变换的中心区域的半径为r,可以理解为r是哈哈镜的范围大小。对于变换后(x’, y’)与原图像(x,y)的映射关系如下:
上面的坐标采用的是直角坐标系。程序中对于某一点的坐标使用的是这样的二维数组,其对应的就是直角坐标是(x, y)。上面计算出的 可能是含有小数的,如(12.34,56.78),在原图像上是找不到这样的位置的,需要进行处理。可以直接使用NN(最近邻)算法,也就是将上述位置四舍五入为(12, 56),但这样误差较大,会出现较多模糊点或空缺点,这里使用双线性插值进行重采样。双线性插值思路是计算出这个点的周围四个点(左上,右上,左下,右下)的像素值,设为
先进行2次水平方向的线性插值 (a, b)之间的插值:
(c, d)之间的插值:
再进行1次竖直方向(e, f)的线性插值
由此就可以得到该位置的像素值,但并不是所有映射后的像素点都需要2次水平插值1次竖直插值,对于整数位置的像素点只需要1次水平或竖直插值或者不插值。通过上述算法,即可得到一个凹面镜的反射后图像效果,即中心放大效果,对于其它曲面镜面的算法可以由上推出,比如让人变高的曲面镜,此时设置cx=1,而cy=-0.5, 即可得到一个水平方不变形而垂直方向拉伸效果的图片。对于更加复杂曲面,则可以理解为镜面是由多个凸凹镜面相切而组成的多中心组合的变成变换。并且控制每个曲面中心(x, y)两个方向的变形量,即可得到变化万千,让人哈哈大笑的效果图片,如下图这样:
四、软件系统设计 本软件开发主要使用到了MYD-YG2L的SDK,使用了OpenCV SDK与QT SDK以及OpenGL SDK。QT 主要为图片显示与文件选取操作,使用OpenGL 来实现图像扭曲变形的处理。 设计QT UI,选择文件或者摄像头拍摄图片:
加入UI简单的交互代码
开发图像畸变处理,这里分别使用 c/c++处理与GPU处理进行对比,c/c++处理代码如下:
而通过OpenGL 使用 Shader 按以上算法编写着色器代码如下,可见简洁很多:
把上面QT的测试程,放到开发板的交叉编译环境编译,把编译的结果部署到开发板上。把着色器文件也放到开发板上,分别进行运行测试,经过实际测试,对比两者的效果以及运行效率。
五、软件运行效果把QT软件与相关的shader渲染脚本部署到开发板上后,即可以启动运行测试效果,开发板上启动运行QT程序命令:./distorting_mirror -platform linuxfb首先使用 c/c++实现的算法,运行后,选择一张图片,点击“哈哈”效果显示如下:
图片尺寸为1706x1280,处理速度非常快,耗时大约0.46秒。
再测试一张同样大小的一个小朋友的照片,使用GPU执行着色器来渲染这个图片,可见也得到了正确的结果:
而这次记录的转换时间,有了突飞猛进的效果,耗时大约0.06秒。可以具备GPU处理器的计算单元对图像处理有着非常显著的加速效果。
六、开发后记此次通过在MYD-G2L开发板上分别使用c/c++代码与shader代码实现了哈哈透镜的图像变换效果,从测试中可见,使用GPU能够显著的提升图像的处理速度,并且使用OpenGL能够快速简单的开发出多种透镜变换效果。有了这么有趣的工具,可以实现各种哈哈镜的效果,通过引入不同的变换函数,就可以实现光怪陆离的光影视觉,比如万花筒,多棱镜等效果。
七、参考文献与资料. MYD-YG2LX开发板文档:http://down.myir-tech.com/MYD-YG2LX 抖音-哈哈镜的原理https://www.douyin.com/video/7097772968641695016 .MYD-YG2LX_Linux软件开发指南http://down.myir-tech.com/MYD-YG2LX/User_Manual.zip .SDK 及原理图仓库:http://down.myir-tech.com/MYD-YG2LX/01_Documents.zip
《OpenGL 参考手册(第3版)》(美)Dave Shreiner主编,孙守迁,王剑,林宗楷等译 Shader开发指南-OpenGL渲染管线https://zhuanlan.zhihu.com/p/522800485 (C++)的简单哈哈镜实现https://blog.csdn.net/m0_51653200/article/details/127165890
页:
[1]