【问题标题】:Render image on the surface with Mayavi and Python使用 Mayavi 和 Python 在表面上渲染图像
【发布时间】:2016-07-01 17:57:39
【问题描述】:

我正在尝试使用 Python 和 Mayavi 创建可视化。
该可视化的目的是在路径的不同阶段显示轨迹和相机平截头体。

我正在努力解决的问题是使用实际图像对相机平截头体多边形进行纹理化。

我愿意暂时将性能考虑放在一边,并希望找到一种方法来使用 numpy 提供的图像对 mayavi 创建的表面进行纹理处理。

找到了最有希望的建议there,但我在实施它们时无法构建表面。

def render_image(self, frustum, timestamp):
        surf = mayavi.mlab.surf(frustum[0, :-1],
                                frustum[1, :-1],
                                frustum[2, :-1],
                                color = (1.0, 1.0, 1.0))

这是表面创建的代码,其中 numpy 数组平截头体的行分别是 x、y、z 坐标,最后一个、第五个点是金字塔的尖端,因此网格不需要。

x [-8.717184671492793, -8.623419637172622, -8.363581977642212, -8.269816943322041]
y [-4.563044562134721, -4.941612408713827, -4.37100415350352, -4.749572000082626]
z [13.614485323873417, 13.703336344550703, 14.059553426925493, 14.148404447602779]

这是一个函数输入的例子 - 四个 3D 点代表所需多边形的顶点。

然而,surf 函数在该输入上失败:

File "/usr/local/lib/python2.7/dist-packages/mayavi/tools/helper_functions.py", line 679, in __call_internal__
    aspect_ratios = [(zf - zi) / (xf - xi), (zf - zi) / (yf - yi)]
ZeroDivisionError: float division by zero

注意:我可以使用 mayavi.mlab.imshow 渲染图像,但我发现根据轴角度和比例矢量指定图像姿势和大小容易出错且繁琐,因此我不愿意接受指向那个方向的答案。

非常感谢您的帮助。

【问题讨论】:

  • 我建议您尝试稍微减少问题,以便您有一个更简单的示例来解决问题。如果问题的根源仍然无法解决,请完整提供数据和代码,以便人们更容易重现您的问题。这将有助于解决因版本或硬件更改而引起的问题。
  • @DebanjanBasu,谢谢。实际上,这个问题对我来说仍然很重要。我会修改问题并更新。
  • 我正在尝试做同样的事情。你找到方法了吗?
  • @martinako 不。但我会尽快抽出时间再试一次,并会更新进展

标签: python 3d mayavi


【解决方案1】:

我必须用 mayavi 绘制带纹理的相机! 见:

虽然我的做法是使用 mlab.imshow,所以这可能是您不想要的答案类型。请参阅此代码:

obj=mlab.imshow(image.T)
obj.actor.orientation = np.rad2deg(camera.w_Rt_c.euler)
pp = np.array([0, 0, camera.f])[:,None]
w_pp = camera.w_Rt_c.forward(pp)
obj.actor.position = w_pp.ravel()
obj.actor.scale = [0.8, 0.8, 0.8]

image 是一个 (n,m) numpy 数组,由于某种原因 imshow 会显示旋转 90 度的图像,这就是我转置它的原因。

obj.actor.orientation 期望 yaw、pitch、roll 角度是度数。图像的旋转是各个旋转矩阵 Rx(yaw)*Ry(pitch)*Rz(roll) 的乘积。在代码中,我将相机用于我的相机类的世界欧拉角(目前无法共享该代码)。

图像的位置设置为 3d 位置,我的相机的主点将转换为世界坐标。

为什么比例因子是 0.8 是个谜,如果我把它留为 1,图像平面看起来比截头锥大???

我将上述内容封装在一个类中,该类需要一个摄像头和一个图像,并在给定摄像头的位置和方向绘制平截头体和图像。

【讨论】:

  • 尽管 imshow 方法不太受欢迎,但我将使用您的示例并对其进行更多修改。收到满意的结果后,我会接受。
猜你喜欢
  • 1970-01-01
  • 2015-04-24
  • 2014-09-18
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多