如何根据相机的位置变换图像

时间:2012-08-19 23:10:19

标签: ios image camera transformation perspective

我正在尝试根据外观方向创建图像的透视投影。然而,我在这个领域缺乏经验,无法自己做到这一点。你能帮帮我吗?

有图像和观察者(相机)。如果摄像机可以被视为不可见球体上的物体,而图像是一个穿过球体中间的平面,则摄像机位置可以表示为:

  

x = d cos(θ)cos(φ)

     

y = d sin(θ)

     

z = d sin(φ)cos(θ)

其中θ是纬度,φ是经度,d是距图像中间的球体中间的距离(半径)。

我发现这些公式在哪里,但我不确定坐标(我不知道,但我认为x应该是z,但我想这取决于坐标系)。

现在,我需要做的是对图像进行适当的转换,使其看起来就像从相机中看到的那样(从正确的角度来看)。你能好好告诉我一些如何做到这一点的话吗?我应该采取什么措施?

我正在开发一个iOS应用程序,我想我可以使用QuartzCore中的以下方法。但是我不知道我应该向这个方法传递什么角度以及如何从摄像机位置导出新的x,y,z坐标。

CATransform3D CATransform3DRotate (CATransform3D t, CGFloat angle,
    CGFloat x, CGFloat y, CGFloat z)

到目前为止,我已成功创建了一个简单的观看视角:

  
      
  1. 使用单位矩阵(作为CATransform3D参数),.m34设置为1 / -1000,
  2.   
  3. 将我的图像旋转角度φ与(0,1,0)向量
  4.   
  5. 将结果与θ和(1,0,0)向量的旋转连接,
  6.   
  7. 忽略基于d的缩放(我根据其他一些标准缩放图像)。
  8.   

但我得到的结果并不是我想要的(很明显): - /。只要这两个角度中的一个接近于0,透视就看起来很逼真。因此,我认为可以有一种方法以某种方式计算出适当的角度以及x,y和z坐标以实现正确的变换(这可能是错误的,因为这只是我的猜测。)

1 个答案:

答案 0 :(得分:2)

我认为我设法找到了解决方案,但不幸的是基于我自己的计算,思考和实验,所以我不知道它是否正确。似乎没问题,但你知道......

所以如果坐标系是这样的: enter image description here

并且要变换的图像的平面穿过X轴和Y轴,其中心位于系统的原点,然后是以下坐标:

  

x = d sin(φ)cos(θ)

     

y = d sin(θ)

     

z = d cos(θ)cos(φ)

定义一个从坐标系原点开始并指向观察图像的摄像机位置的矢量。 d 可以设置为1,因此我们可以立即获得单位向量而无需进一步标准化。 θ是ZY平面中的角度,phi是ZX平面中的角度。 θ从Z +到Y +轴从0°升高到90°,而phi从Z +升高到90°到X +轴(在两种情况下都是相反方向的-90°)。

因此转换向量是:

  

x1 = -y / z

     

y1 = -x / z

     

z1 = 0。

我不确定z1 = 0 ,但绕Z轴旋转对我来说似乎不对。

要计算的最后一件事是必须转换图像的角度。在我看来,这应该是指向相机的矢量(x,y,z)与图像的法线矢量之间的角度,即Z轴(0,0,1)。

两个向量的点积给出它们之间角度的余弦,因此角度为:

  

α= arccos(x * 0 + y * 0 + z * 1)= arccos(z)。

因此,alpha角度和x1,y1,z1坐标是我在问题中提到的CATransform3DRotate方法的参数。

如果有人能告诉我这种方法是否正确,我将不胜感激。非常感谢!