gpt4 book ai didi

opencv - 如何获得3D模型的转换矩阵到2D图像中的对象

转载 作者:行者123 更新时间:2023-12-02 17:42:36 30 4
gpt4 key购买 nike

给定对象的3D网格文件和包含该对象的图像,有哪些技术可以获取图像中3d对象的方向/姿势参数?

我尝试搜索一些技术,但大多数似乎都需要对象的纹理信息或至少一些其他信息。有没有一种方法可以仅使用图像和3D网格文件(wavefront .obj)来获取姿势参数?

这是可以预期的2D图像示例。
enter image description here

最佳答案

  • 相机的FOV

    相机的视场绝对是最小的知识,甚至从此开始(如果不知道对象如何影响场景,如何确定如何放置对象)。基本上,您需要从世界 GCS (全局坐标系)映射到“相机/屏幕空间”并返回的变换矩阵。如果您不知道我在写什么,那么在学习数学之前,您不应该尝试任何一种方法。

    对于未知相机,您可以基于 View 中的标记或etalone(已知尺寸和形状)进行一些校准。但是更好的方法是使用真实的相机值(例如x,y方向上的FOV Angular ,焦距等)

    此操作的目标是创建一个将世界 GCS (x,y,z)映射到Screen LCS (x,y)的函数。

    有关更多信息,请阅读:
  • transform matrix anatomy
  • 3D graphic pipeline
  • Perspective projection
  • 轮廓匹配

    为了比较渲染图像和真实图像的相似性,您需要采取某种措施。当您需要匹配几何形状时,我认为轮廓匹配是一种方式(忽略纹理,阴影和填充物)。

    因此,首先您需要获取轮廓。为此使用图像分割,并创建对象的ROI蒙版。对于渲染图像来说,这很容易,因为您可以用单色渲染对象,而无需任何光照直接进入ROI蒙版。

    因此,您需要构造计算轮廓之间差异的函数。您可以使用任何一种测量方法,但我认为您应该从非重叠区域像素数开始(很容易计算)。

    diff pixels

    基本上,您可以计算仅存在于一个ROI(感兴趣区域)蒙版中的像素。
  • 估算位置

    当获得网格时,便知道其大小,因此将其放置在GCS中,以便渲染的图像与真实图像的边界框非常接近。如果没有FOV参数,则需要重新缩放和转换每个渲染图像,使其与图像边界框匹配(结果,您只能获得方向,而不是粗糙对象的位置)。相机具有透 View ,因此您将物体放置在距离相机越远的地方,物体将越小。
  • 适合方位

    呈现一些固定的方向,并覆盖一些方向,并带有一些8^3方向的步骤。对于每个计算轮廓的差异,并选择差异最小的方向。

    然后将其周围的方位角调整到最小以使差异最小。如果您不知道优化或拟合的工作原理,请参见以下内容:
  • How approximation search works

  • 当心初始取向的量过少会导致错误的定律或错过的解决方案。量太 Assembly 很慢。
    现在,简而言之就是一些基础知识。由于您的网格不是很简单,您可能需要进行调整,例如使用轮廓代替轮廓,并使用轮廓之间的距离而不是不重叠的像素数,这确实很难计算...您应该从更简单的网格开始,如骰子,硬币...当掌握了所有这些趋势后,就变成了更复杂的形状...

    [Edit1]代数方法

    如果您知道图像中的某些点与(网格中的)已知3D点相对应,则可以与使用的摄像机的FOV一起计算放置对象的变换矩阵...

    如果转换矩阵是 M(OpenGL样式):
    M = xx,yx,zx,ox
    xy,yy,zy,oy
    xz,yz,zz,oz
    0, 0, 0, 1

    然后,将网格物体( x,y,z)中的任何点转换为全局世界 (x',y',z'),如下所示:
    (x',y',z') = M * (x,y,z)

    像素位置( x'',y'')由相机FOV透视投影完成,如下所示:
    y''=FOVy*(z'+focus)*y' + ys2;
    x''=FOVx*(z'+focus)*x' + xs2;

    相机在 (0,0,-focus)处,投影平面在 z=0处,而观看方向在 +z处,因此对于任何焦距 focus和屏幕分辨率( xs,ys):
    xs2=xs*0.5; 
    ys2=ys*0.5;
    FOVx=xs2/focus;
    FOVy=ys2/focus;

    将所有这些放在一起时,您将获得:
    xi'' = ( xx*xi + yx*yi + zx*zi + ox ) * ( xz*xi + yz*yi + zz*zi + ox + focus ) * FOVx
    yi'' = ( xy*xi + yy*yi + zy*zi + oy ) * ( xz*xi + yz*yi + zz*zi + oy + focus ) * FOVy

    其中( xi,yi,zi)是 i-th在网格局部坐标中的已知点3D位置,而( xi'',yi'')是对应的已知2D像素位置。因此, M值是未知数:
    { xx,xy,xz,yx,yy,yx,zx,zy,zz,ox,oy,oz }

    因此,每个已知点有2个方程,总共有12个未知数。因此,您需要知道6点。解决方程组并构建矩阵 M

    也可以利用M是统一的正交/正交矩阵,因此 vector
    X = (xx,xy,xz)
    Y = (yx,yy,yz)
    Z = (zx,zy,zz)

    彼此垂直,因此:
    (X.Y) = (Y.Z) = (Z.X) = 0.0

    通过将这些点引入您的系统,可以减少所需点的数量。您也可以利用叉积,因此,如果您知道2个 vector ,则可以计算周长
    Z = (X x Y)*scale

    因此,您不需要3个变量,而只需单个比例(对于正交矩阵,则为1)。如果我假设正交矩阵,则:
    |X| = |Y| = |Z| = 1

    因此我们得到了6个其他方程式(3 x点,3个叉号),没有任何其他未知数,因此3点的确足够。

    关于opencv - 如何获得3D模型的转换矩阵到2D图像中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42608708/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com