【问题标题】:Translate/Rotate 2D points to change perspective平移/旋转 2D 点以改变视角
【发布时间】:2016-12-12 16:20:57
【问题描述】:

我正在录制用户眼睛的视频,然后使用计算机视觉跟踪他们的眼睛以尝试估计他们的注视,但是我能够记录用户的角度不是直的,并且表示需要显示数据,就像用户直视一样。

为了进一步解释我自己,请考虑以下图片,这些图片描述了我到目前为止所拥有的以及我正在努力实现的目标:

我认为实现这一点的最佳方法可能是转换视角,但我并不精通这一点,我不知道从哪里开始。

我愿意接受任何关于达到预期结果的最佳方法的建议,但请记住,我的矩阵数学相当生疏,所以如果您使用任何众所周知的方法,请迎合我的无知并解释一切尽你所能。

数据当前存储为 X/Y 点的 NumPy 数组

【问题讨论】:

    标签: python numpy 2d matrix-multiplication perspectivecamera


    【解决方案1】:

    我的矩阵数学比“相当生疏”还要糟糕,但我有一些想法可能会有所帮助。

    总体而言,与转换离散点相比,转换图像的信息要多得多。您可能希望研究变换图像的眼睛部分,而不是变换瞳孔点。

    无论如何,这是我的想法:

    方法一:简单的透视变换

    This answer 描述了如何在 Python Imaging Library 中执行透视变换,使用 numpy 计算变换的系数。

    将其调整为对点而不是图像进行操作可能很容易(谷歌建议 scipy 具有一些类似于 PIL.Image.transform 的功能,这可能更适用)。如果做不到这一点,您可以将点渲染到二进制图像上,作为黑色背景上的白色像素,然后转换该图像并将点读回。

    但是,对于透视变换,您仍然需要一种方法来确定您要变换的平面 pa 的坐标。只需在眼睛周围拟合一个矩形,您就可能获得合理的结果。为此,我可能会旋转您的图形,使其与 X 轴平行,方法是在眼睛的末端之间构建一条线,然后从 0° 旋转该线的角度。然后我会记录边界框,然后将两者都旋转回来。您的飞机将如下所示:

    此时,您也许可以提取眼睛主要轮廓的角度,并相应地捏紧您的边界矩形。不过,简单的透视变换可能会被证明是不可靠的。

    方法 2:更好的视角转换

    给定一组起点和一组终点,几乎可以肯定有一种方法可以从中计算透视变换系数,即使数字大于 4。您可以跳过边界框并假设将每个点转换为它在理想形状上的对应物,然后根据它计算系数。不要问我怎么做,不过,我不知道:P

    方法 3:基本拉伸

    如果您的“目标形状”与您要转换的形状具有相同数量的点,您可以模拟许多图像编辑程序的拉伸功能。 Photoshop 有一些工具可以让你在形状上拉点来移动它们,拉伸里面的内容。如果您可以重现此行为,您只需将起始形状上的每个点移动到目标形状上的相应点,从而拉伸图像。这可能是最可靠的方法,只需拉伸图像以适合目标形状,然后从新图像中拉出瞳孔。


    所有这些方法的问题在于,正常的透视变换永远不会很准确,因为眼睛是弯曲的,而不是扁平的。您不能真正用平面近似眼睛的表面并期望完全准确。即使拉伸(方法 3)也会受到照片角度的影响;它会偏向眼睛的可见侧,并使其看起来好像眼睛向左(他们的右侧)看远比它看的多。 如果照片的角度恒定且已知,您或许可以自行修正。否则,我看不到解决这个障碍的简单方法。


    我对高级数学知之甚少,但希望我的想法对您有所帮助。

    FWIW,眼动追踪已经得到很好的研究,并且有几篇详尽的论文,例如this one

    【讨论】:

    • 很好的答案,我会看看这些方法。如果没有人提供更好的解决方案,我很乐意奖励你。
    • 谢谢!我并没有真正提供明确的答案,所以如果出现更好的答案,他们绝对应该得到赏金,但否则听起来很棒。 :D
    猜你喜欢
    • 2014-06-30
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多