李瑞民,张敬平
(1.上海风格信息技术股份有限公司,上海201804;2.上海戏剧学院,上海200040)
现在大量城市标志型建筑,喜欢在夜间将整座大楼作为一个天然的显示屏,然后通过投影的方式,将要展示图片或视频投射到大楼上,以达到气势宏大和广告宣传的展示效果,这种方式称为“大楼幕墙投射”[1],如图 1所示。
图1 大楼幕墙投影实例图
不难想象,只要大楼投射面不是球面内侧,并且投影机没有位于“球心”位置,则会因为投射角度的问题而产生在屏幕上图像的变形。这种变形直接导致图像的扭曲失真。如果是直接室内的投射,通常的作法是在室内先找一个银幕,或者是一个白色墙的竖立面。投影机距离墙的竖立面很近,所以即使银幕不是球形,或投影机球体的“球心”,这种小范围的画面扭曲变形并不明显,因而这种方式被广泛应用。但当将整座大楼的一面作为投射区的时候,该投影机一般只能固定放置在楼前的地面上的,并且由于楼前广场的范围有限,所以投影机距离大楼一般不是很远,这时,如果大楼的高度很高时,所投射的图像或视频会产生较大的扭曲失真。
投影机将图像投射到“大楼投面墙”上的“幕墙投影区”中,由于幕墙不是球面,投影机也不可能处于“球心”处,所以所投的影像效果肯定会产生失真,并且根据生活常识,初步可以判断越往幕墙的上部区域,失真越厉害。假设观看投射内容人位于无穷远处,虽然事实上无穷远是不可能的,但是当观众足够远的时候,其效果会更接近这种无穷远,这时观众所看到画面将因图像扭曲而无法接受[2]。
分析上述现象产生的原因,是因为投影机在设计的时候,其默认的投影区域是一个内侧球面,当不是球面的时候,就会产生失真;而位于“无穷远”的观众所需要看到的是一个接近于完全均匀的平面。当室内投射的时候,由于摄影机和投影区域距离很近,投射区域很小,并且最重要的是,投影机“接近”于投射区域的“球心”,所以失真很少,观看者的失真感受不明显;但当上述条件不满足相反时,问题就变得比较严重,甚至最终无法接受。
那么解决问题的关键是,找到二者的契合点,将投影
机的投射转换为与投射区域“自适应”的效果,使投影机在投射的时候,就能根据投射区域的形状或位置,先行进行“反扭曲”的转换,这种转换的目的,就是使得最终的投射效果本身就是扭曲的,但是对于观众来说,反而是正常的[3]。解决此问题的办法,一种是针对具体的大楼幕墙设计专一的投影机,然而这种治标不治本的办法既增加了成本,也缺乏灵活性。另一种办法就是直接在普通的投影机上加上一个“滤镜”(Filter)对图像或视频进行转换,进而针对不同的大楼,只需要通过几个特定的参数设置,就可以自动适应不同的转换,从而达到质的改进。
算法的关键在于如何找到这样一个“滤镜”,对投影机来说,所设计的投影区域是一个球面,对观众来说,所需要的投影区域是一个均匀平面。现实中,二者都会设计成一个矩形的区域,并且无论是投影机,还是大楼投影区域,其水平方面的点都是均匀的,不存在扭曲变形,所产生扭曲的区域主要是垂直方面,所以在下面算法的设计中,可以忽略水平方面,而只考虑其中的垂直截面即可[4]。当然,如果投射的区域,在水平方向上也有类似的扭曲,则算法相同。
根据生活常识,摄影机一般放置在大楼前面一定的距离,直接投向大楼的侧面墙,并且为了使远处的人可以看到投影效果,所以投影的顶端一般位于大楼侧面的顶端,而底端则并不位于大楼侧面的底端,而是距离地面有一定的距离,如图2所示。
图2 大楼幕墙投影模型
图2 中,C是投影机的位置,右侧竖直线是大楼的投面墙的切面(假设该墙是一个竖直的垂面),投影机与大楼侧墙与地的交点的距离为L(称为“离楼距离L”)。在大楼上,投影的最下一条线在大楼侧墙上的高度距地高度为G(称为“距地高度H”),与地夹角为β;投影的最上一条线与最下一条线在大楼侧墙上的高度差为H(称为“投影高度H”),在投影机上的夹角为α。
为了便于进行定量分析,在上述分析中,夹角α内的投影均会投射在“投影高度H”中,如果将二者各做一个四等分,则夹角α会被线(一)~线(五)四等分;“投影高度H”会被线(1)~线(5)四等分。根据前面的描述,可知线(一)和线(1)、线(五)和线(5)会始终重合,但线(二)、线(三)、线(四)和线(2)、线(3)、线(4)则不一定会两两重合。
首先分析线(一)~线(五)的计算方式,不难看出:
推而广之,在现实应用中,数字投影机所投的图像,与计算机中所显示的分辨率类似,都可以组成一个矩形点阵,根据上面的分析,如果只考虑垂直方面,则只需要任选一条垂直线进行分析即可。假设垂直分辨率为v,根据上述分析,不难推出,这些第n根线与地的夹角为
其次再分析线(1)~线(5)的计算公式,同样可以看到:
将上述公式进行推广,并同样假设垂直分辨率为v,则不难推出第n根线与地的夹角为
在图2的分析中,线(一)~线(五)对应的是投影机所能提供的等分线,而线⑴~线⑸是大楼投影区所需要的等分线。前者线(一)~线(五)是可以进行调整的,后者线(1)~线(5)则是无法进行调整的,观众要看到的是后者的效果,所以应该尽可能调整前者,以便后者与实际情况更接近。
根据图2,可以看到线(一)投射到了线(1)处,故不需要再调整。线(二)位于线(1)和线(2)之间,为了保证线(2)颜色接近于实际的效果,可以调整线(二),将其值转换为介于原线(一)和线(二)之间的颜色,并且,其调整的幅度,按比例线(二)位于线(1)和线(2)之间,距离线(1)和线(2)的远近作为比例。同样的方法,线(三)、线(四)可以如法炮制做出转换。最终,线(五)和线(1)重合,所以可以直接投射。
总结上述方法,就是对于垂直分辨率的第一和最后一根线,可以直接复制,对于介于其中的线,则首先找到该线位于哪一个投射区域等分线段内,然后根据该区域两边边界的颜色值,结合该线在等分线段内所占的比例,转换颜色值。
要验证上述理论,最好的办法就是通过程序进行验证。分析上述算法,首要的是先将图像或视频中的像素点阵读取出来;第二步要做的就是根据上述算法对图像点阵中每个像素进行转换,其转换的目的,就是要将转换后的图像通过投影机投放到投影区里,可以适合于远处观众观看无失真的图像或视频。
众所周知,无论是图像,还是视频,都采用了各种压缩算法,其目的就是避免图像文件或视频传输的数据量过大。要将图像或视频中的像素点阵从压缩的视频文件或视频流中读取出来,方法有很多种,一种办法是找到该图像的压缩标准,然后按照解压缩的算法自己编程进行读取;另一种办法就是直接从网上查找一些现成的软件工具包,直接进行调用达到目的。例如OpenCV可以将目前主流的各种格式图像文件打开,读取点阵数据,而FFmpeg则除了可以将各种主流的视频文件打开之外,还可以打开视频流,然后将其中每一帧的图像点阵读取出来。
将一张图像的各个像素值读取出来以后,就可以将所有数据看成一个二维的点阵,由于同一行中,每个像素值的处理方式是一样的,所以下面的处理可以行为单位。
图3 算法流程图
从图3可以看出,每一行的处理主要分为两步,第一步是“找投影机角度所在投影区域的范围”,由式(1)可知第i行线的角度是,由式(2)可知第n个区段的边界值为arctan,只要将第i行线的角度分别与后面两个边界值作比较,即可知道第i行线是否位于第n个区段中。
第二步是“根据投影区域范围测算实际RGB值”也不难计算,首先用“第i行线与第n个区段的上边界的差”除以“第i行线与第n个区段的下边界的差”算出第i行线占整个角跨度的比例。然后将两边界值所对应的颜色进行转换。
以像素的红色分量为例,则:
最后的r3即为所要显示的红色分量,同样的办法可以算出绿色和蓝色分量。
通过上述的分析和设计,可以程序的验证。在Win7下,通过Visual C++编写演示程序,采用OpenCV技术实现其算法,算法的演示效果如图4所示。
图4 滤镜算法实例图(截图)
图4a为原始图片,当输入“地面到投影区底部距离”(即图2中的G)、“大楼投射区的高度”(即图2中的H)和“投影机到楼底部的距离”(即图2中的L),并单击“开始投影”按钮时,可以看到滤镜算法处理后的效果,即图4b。
在实际应用中,只需要知道上述3个参数即可。而这3个参数可以通过简单的测算获得。
如果一个大楼的投影面不是一个与地面垂直的墙面,则并不影响该算法的使用,如图5所示。
图5 当大楼投射面不是垂直面的示意图
当大楼不是垂直面时,可以如图5所示引出辅助线(图5中虚线所示),然后通过一些简单的几何运算,即可获得,即H'=H;L'=L×cosγ;G'=G+L×sinγ。
近年来,随着人们娱乐要求和商业活动的紧密结合,越来越多的高楼大厦会在晚上以投放图像或视频的方式达到娱乐大众的效果,全面采用LED彩屏成本太高,而直接采用数字投影机又会出现变形[5]。而本文,正是针对解决这一问题的初步尝试。通过本方式,将复杂的应用通过滤镜的方式得以解决,希望能抛砖引玉,推进这种应用的发展。
[1]李超,许春耀,潘林,等.面向投影环境的计算机视觉交互信息获取[J].电视技术,2013,37(11):104-107.
[2]刘苏醒,安平,张兆杨.DIBR中基于平面扫描的深度重建方法[J].电子器件,2008,31(1):320-324.
[3]李文杰,吴黎明.投影-摄像人机柔性互动技术的分析与探讨[J].电视技术,2013,37(17):178-182.
[4]鲍绪良,王元庆.立体图像生成的视差控制[J].现代电子技术,2012,35(16):75-78.
[5]刘全恩.大屏幕投影机技术发展趋势[J].电视技术,2013,37(4):1-5.