红蓝3D的原理

以下文字转自:

http://www.cvlover.com/?p=328

买了一个红蓝3D眼镜,哈哈,看那些大片还真的有点效果,可惜目前的最大问题就是片源太少。怎么办呢?后来发现QQ影音有2D转3D的功能,于是满怀期待的转了一下,后来我发现其果断坑爹,绝对是,只看到字幕面前在前面,其他都是平面的。你叫别人情何以堪啊,腾讯哥哥。接上面博文,有提到2D转3D的相关技术,既然我现在有了红蓝眼镜了,那就自己写个红蓝3D制作的软件玩玩吧。好吧,于是到网上一搜,资料好少啊好少啊。英文的还是有一点的,现在就整理一下,方便自己后面的应用,呵呵。

大多数人类都拥有两只眼睛和一套神奇的双眼视觉系统。对于大约6到7米远的物体,双眼视觉系统能让我们对物体的距离轻松做出准确判断。例如,如果我们的视野中有多个物体,我们能够自动分 辨出哪个离我们更远、哪个离我们更近,以及它们相距多远。如果你闭上一只眼看东西,虽然仍然 能够感知距离,但是精度会下降,并且你必须依靠视觉暗示,所以判断速度更慢。我们的双眼视觉系统依赖于一个事实,那就是我们的双眼之间有大约5cm的距离,因此,每只眼睛 分别从稍微不同的视角看东西,而你大脑中的双眼视觉系统则利用这种差别来计算距离。你的大脑
能够将两只眼睛看到的图像关联起来,尽管他们有些许不同。说了这么多,其实记住一点就行了,视差就是立体的根本,也就是说有视差才能表现出深度。

那么怎么表现视差呢?

在讨论这个问题之前,我们先来补充一下一些理论知识:

互补色原理:补色指完全不含另一种颜色。例如:红色的互补色为青色  红色的RGB值是(0–255),0,0;而青色的RGB值是0,(0–255),(0–255),由于它们不含有对方的颜色,利用这个特点,我们用红色来保存一幅图像的信息,而用青色来保存另一幅图像的信息,这样就完全可以用一幅图像来包含两幅图像的信息了。只要这两幅图片存在视差那就能表现出深度来了。我们可以用一个公式来表达;第一幅图像RGB1=R1,G1,B1;第二幅图像RGB2=R2,G2,B2,合成后的立体图像RGB12=R1,G2,B2或RGB21=R2,G1,B1。从公式RGB12=R1,G2,B2中可以看出,合成后的立体图像实际上包含了第一幅图像的红色RGB=R1,0,0和第二幅图像的青色RGB=0,R2,B2。

我们再来研究一下所谓的红蓝眼镜:

红色眼镜片的RGB值是255,0,0;青色眼镜片的RGB值是 0,255,255,因为红色才能透过蓝色眼镜片,传送到我们左眼的图像的RGB红=R1,0,0;因为只有青色才能透过青色眼睛片,传送到我们右眼的图像的RGB青=0,R2,B2。这样包含在一幅红蓝立体图中的两幅图像的信息就被分别传送到了我们的左右眼睛。再使这两张图片出现视差就可以鸟!

image

 

大概原理就是这样。

再给大家弄点数学基础吧:

1)标准的投影模式,标准的投影模式采用的是单点透视法,场景对象从单眼投影到视口的近裁面上。

image

2)立体成像采用的是两点透视法,场景对象通过不同的左右两眼透视投影到同一个屏幕上。

7(OYD2YLMZY5~XCRPN)DTZY

3)在视空间,单眼,左眼和右眼的视线方向都是平行的。有效视锥体为左右两眼的视锥的交集.

image

image

4) 对于左右眼的投影矩阵,都是中间单眼投影矩阵的平移修改版。由下图,左右两眼的透视点分别相对于原来的单点在X轴上上下平移了。

image

5)在视空间对于屏幕内的一点对左右两眼做透视投影,在屏幕上分别得到两个投影点,两个投影点的标量差(右眼减去左眼,视空间X轴方向为正方向)被称之为视差,当视差为负值时,给观察者的感觉是顶点在屏幕的外面;当一个物体从远处慢慢接近屏幕时给人的感觉就是一种飞出屏幕的立体效果.image

image

6)在归一化的视窗里,视差 = 深度因子 * (1 – 屏幕深度/W),视差Parallax为深度W的增函数,随着深度的增加,视差值越大,且随着W的增加视差无限接近于一极限值。

深度因子:视差的最大值,理论上离屏幕越远,视差值越大,当顶点里屏幕无穷远时,视差值无限接近于一个定值.

image

最后的结果:

 

左眼图

右眼图

最终效果图

具体的步骤可能有:(英文来的,看不懂自己想办法)

  1. Write a function that takes two pictures as parameters, one representing a left eye image, and the other representing a right eye image. These pictures must have the same width and height. This function will create a new picture that has the same width
    and height as the originals. The pixels in this new picture will get their red values from the left eye image, and their blue and green values from the right eye image. The new picture should be returned at the end of the function.
  2. (Optional, but check it out.) If you are working with color photos, you may find that it is easier to see them in 3D if you first convert them to grayscale. You may copy and use one of your grayscale functions from Lab 2 to do this.
  3. Experiment with different images until you find something creatively pleasing. Save your 3D image as a new .png image. (You could save it as a .jpg image, but the compression used with .jpg causes us to lose some color information related to the 3D perspective.)

文章参考:http://www.cnblogs.com/seesea/archive/2010/04/11/1709447.html

http://max.cs.kzoo.edu/cs107/labs/pp1.shtm

版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.

    分享到:

Leave a Reply

Your email address will not be published. Required fields are marked *