我在屏幕空间中有4个2D点,我需要将它们反向投影回3D空间.我知道4个点中的每一个都是3D旋转的刚性矩形的一个角,我知道矩形的大小.如何从中获取3D坐标?
我没有使用任何特定的API,我没有现有的投影矩阵.我只是在寻找基本的数学来做到这一点.当然没有足够的数据将单个2D点转换为3D而没有其他参考,但我想如果你有4个点,你知道它们在同一个平面上都是直角相交的,而且你知道它们之间的距离,你应该能够从中找出它.不幸的是,我无法解释如何.
这可能属于摄影测量的范畴,但谷歌搜索它并没有让我获得任何有用的信息.
给出了由透视图扭曲的矩形的2d图片:

我知道形状最初是一个矩形,但我不知道它的原始大小.
如果我知道这张照片中角落的像素坐标,我该如何计算原始比例,即矩形的商(宽度/高度)?
(背景:目标是自动取消矩形文档的照片,边缘检测可能会用hough变换完成)
已经讨论了是否有可能根据给出的信息确定宽度:高度比.我天真的想法是它必须是可能的,因为我认为没有办法将例如1:4的矩形投射到上面描绘的四边形上.该比率显然接近1:1,因此应该有一种方法可以在数学上确定它.然而,除了我的直觉猜测,我没有证据证明这一点.
我还没有完全理解下面提出的论点,但我认为必须有一些隐含的假设,即我们在这里缺少这种假设并且有不同的解释.
然而,经过几个小时的搜索,我终于找到了一些与问题相关的论文.我很难理解那里使用的数学,到目前为止还没有成功.特别是第一篇论文似乎准确地讨论了我想要做的事情,遗憾的是没有代码示例和非常密集的数学.
张正友,何立伟,"白板扫描和图像增强" http://research.microsoft.com/en-us/um/people/zhang/papers/tr03-39.pdf p.11
"由于透视失真,矩形的图像看起来是四边形.但是,由于我们知道它是空间中的矩形,我们能够估计相机的焦距和矩形的纵横比."
ROBERT M. HARALICK"从矩形的透视投影中确定相机参数" http://portal.acm.org/citation.cfm?id=87146
"我们将展示如何使用3D空间中未知大小和位置的矩形的2D透视投影来确定相对于矩形平面图的相机视角参数."
geometry reverseprojection image-processing computer-vision projective-geometry
假设我们有一个带有平面的3d空间,其中有一个任意方程:ax + by + cz + d = 0现在假设我们在该平面上选择3个随机点:(x0,y0,z0)(x1,y1,z1 )(x1,y1,z1)
现在我对这架飞机有不同的观点(相机).我的意思是我有一个不同的相机,从不同的角度来看这个飞机.从相机的角度来看,这些点具有不同的位置.例如(x0,y0,z0)将是(x0',y0')和(x1,y1,z1)将是(x1',y1')和(x2,y2,z2)将是(x2',y2) ')从新相机的角度来看.
所以这是我的一个难题!我想从新的摄像机视角中选择一个例如(X,Y)的点,并告诉它在该平面上的位置.我所知道的是3点及其在3d空间上的位置以及它们在新摄像机视图上的投影位置.
你知道平面方程和摄像机位置的系数(以及投影),还是只有六点? - 尼尔斯
我知道前3分的位置.因此我们可以计算出平面的系数.所以我们确切地知道了飞机的位置(0,0,0).然后我们有相机只能看到积分!因此,相机唯一看到的是3点,它也知道它们在3d空间中的位置(并确保它们在2d摄像机视图平面上的位置).毕竟我想看相机视图,选择一个点(例如(x1,y1))并告诉那个平面上的那个点.(当然,这个(X,Y,Z)点应该适合平面方程).此外,我对相机位置一无所知.
我有一个3D数学问题,我似乎无法解决.
我有3分的数据.数据是平面上的(2D)坐标,漂浮在3D空间中的某个位置.我也知道投影的(2D)坐标.这导致以下数据数组:
[[[x1,y1], [px1,py1],
[[x2,y2], [px2,py2],
[[x3,y3], [px3,py3]]
Run Code Online (Sandbox Code Playgroud)
法线(x1等)坐标代表平面上的坐标,另一个(px1等)代表投影坐标.
我想要做的是投射一个新的 2D坐标([x4,y4]).
.
到目前为止我尝试了什么:
当然你需要注意投影,所以我把它设置为[xe,ye,-1].xe和ye是众所周知的.(这是照片参考,所以我只是把眼睛放在照片的中心.)
在眼睛下方,我放置了投影表面(z = 0).这给出了以下投影坐标:
[[[x1,y1], [px1,py1,0],
[[x2,y2], [px2,py2,0],
[[x3,y3], [px3,py3,0]]
Run Code Online (Sandbox Code Playgroud)
我不能对飞机上的坐标做同样的事情,因为我对那架飞机一无所知.
我还想我可以制作一个参数化的公式,从眼睛到投影坐标运行.对于line1,它将是:
line1x = xe+(px1-xe)*t1
line1y = ye+(py1-ye)*t1
line1z = -1+t1 // = -1+(0--1)*t1
Run Code Online (Sandbox Code Playgroud)
我也知道3D点之间的距离.这跟二维相同.这意味着point1和point2之间的距离将是sqrt((x1-x2)^ 2 +(y1-y2)^ 2).
我也知道任何时候线(line1和line2)之间的距离.即sqrt((line1x-line2x)^ 2 +(line1y-line2y)^ 2 +(line1z-line2z)^ 2).
但是,我真的不知道如何从这里开始...或者甚至这是否是正确的路线.
.
我希望你明白我希望能做什么,并且你可以帮助我.
提前致谢!
我在用着
worldview_inverse * (projection_inverse * vector)
Run Code Online (Sandbox Code Playgroud)
将屏幕空间坐标转换为世界空间坐标。我假设
(x,y,1,1)
Run Code Online (Sandbox Code Playgroud)
会变换为远平面上的一个点,而
(x,y,-1,1)
Run Code Online (Sandbox Code Playgroud)
变换为近平面上的点,并连接线我可以查询视锥体中与线相交的所有对象。转换后,我将结果点除以它们各自的 .w 分量。这适用于远平面,但近平面上的点以某种方式转换为世界空间原点。
我认为这与我输入逆投影的 1 的 w 分量有关,因为通常在投影之前它是 1,而不是之后,而且我正在进行逆投影。我究竟做错了什么?