大家好,现在我来跟大家讲讲咱们用这个FPGA芯片可以做什么产品。首先大家可以看看视频,视频上是把高云的板子接到了一个hdmi的投影机上,然后投射colorbar到墙面。

从图片可以看到,如果我们把高云的IDE投射到墙上,图形会发生畸变。所以一般投影机都带有一定的图形畸变功能。
我们这个项目主要就是解决畸变的问题。畸变在学术上已经早已不是问题了,但在人上就是个大问题,比如我们可以了解到会议室畸变的调整,一个项目施工费用可能好几万。那么我们考虑把畸变做到模组上,这个其实是为了减少相关的成本。
随着AI技术的普及,多媒体技术的发展,汽车上的科技感会越来越多,预计,汽车上的投影技术也会越来越多。保守估计咱们这个东西未来在汽车上可能会用到20~30片以上。
下面我们来介绍这个项目的实现原理。
首先我们需要了解一下畸变矫正的原理。

如图所示,我们把高云板子的colorbar投影到墙面,发现它会变形为一个任意四边形,四边行的四个点可以表达这个形变。我通过调整这四个点,可以把图形拉伸到正常的样子,就是让它看起来像个正矩形。所以在投影机的应用里,四点畸变矫正是足够的了。但在汽车上可能很难找到一个平面,而更多的是符合贝塞尔曲线的曲面。这样投影出来的图形将是一个不规则的弧面。

为了解决这样的问题,其实有个叫张氏标定的方法,大家可以百度一下知乎的帖子。
https://zhuanlan.zhihu.com/p/668358597
它大概的思路是把图形分成网格,然后在每个格子里再做四点矩形的畸变修正。如此即可解决不规则曲面的问题。
那我们在FPGA中实现这玩意到底要做什么呢,首先,我们肯定是弄个帧缓冲,咱们这个板子是带有DDR的,想必这些都难不倒宝宝们。接着我们应该就是在帧缓冲里面计算每个像素的位移。
从一个帧缓冲到另一个帧缓冲的变换,我们可以看成是一个数学问题。我们学过的线性代数就是解决这些问题的。下面说说如何在FPGA里面实现这个数学算法。

这是opencv里面的一个函数,我们都知道,opencv是开源的,所以它的代码我们可以拷贝粘贴到高云的芯片里面。那这个透视变换的函数是什么意思呢。
咱们文章标题提到的warp畸变其实讲的就是解决那种不规则曲面的变形的问题。而解决这个问题是把它拆分成多个网格,在每个网格里面做射影变换来达成的。
opencv的这个函数完成了一次射影变换的过程。所以我们着重要理解什么是射影变换。但这会你去百度可能会被吓到,所以我简单说一下。我们高中是有学过立体几何的。投影机把图形投射到地面上,投影机里面的显示图案跟地面畸变后的成像之间就是一个射影变换。也就是前面说的四点畸变。

这里有个射影几何的第一定律,大家看了不要惊慌,因为不少清华北大的研究生也不一定知道,反正就是四点可以确定一个变换,确定了这个变换后四点里面的其它点我们就可以计算出来。所以一张图片,我们经过warp畸变,可以得到另一张图片,这里每个点的一一对应关系就是通过opencv的那个公式可以计算出来了。
当然读到这里很多宝宝应该还会纠结如何把opencv的代码移植到FPGA上这个问题,但其实我们学术派是根本不削与去读人家的代码,甚至一些高材生可以通过线性代数的最小二乘法把中间的点拟合出来,这些我觉得都是可以解决问题的。

如图,FPGA模块主要要实现以上的逻辑,把帧缓冲1的点改变位帧缓冲2的点,然后参数是一个网格,例如10*10的网格,网格的点的坐标则是参数,当然我们的网格不是正的网格,而是变形了的网格,比如被拉长,甚至产生波浪形。
以上起就是咱们的这个产品的实现思路,大致通过这样的一个FPGA的模块,我们可以通过控制他里面的寄存器传入warp参数,改变图形的畸变。这样负责做UI的部门则无需关注畸变的问题,负责显示的部门也无需关注给他送什么图像,专门的标定部门则由一些光学专家来专门解决畸变的问题。这样就让每个部门的人有饭吃,且不会互相打架了。
带warp畸变这样的芯片市面其实早就有了,比如瑞萨的一些soc芯片就带了warp的功能,大家找业内人事问问就知道了。

我的代码比较丑,就不贴出来给大家看了,反正调好以后图形就看起来舒服点了。