C++ 图形渲染管道如何与摄影机矩阵估计算法相关联?

C++ 图形渲染管道如何与摄影机矩阵估计算法相关联?,c++,opencv,graphics,computer-vision,rendering,C++,Opencv,Graphics,Computer Vision,Rendering,在构建计算机图形渲染器(例如传统的软件渲染器)时,通常使用模型、视图和投影矩阵。通过模型矩阵将模型转换为世界空间,然后通过视图矩阵将所有内容转换为相机空间,然后投影到标准化设备坐标。通常情况下,会对视锥进行一些剪裁,必要时会分割三角形。然后,所有可见的三角形投影到屏幕空间并绘制。(如雪莉《计算机图形学基础》) 另一方面,当讨论计算机图形学中的点对应的摄像机姿态估计时,透视n点问题(例如,PnP),这些算法直接估计将对象从模型空间转换为窗口坐标(例如,640x480)的摄像机矩阵 我现在的问题是这

在构建计算机图形渲染器(例如传统的软件渲染器)时,通常使用模型、视图和投影矩阵。通过模型矩阵将模型转换为世界空间,然后通过视图矩阵将所有内容转换为相机空间,然后投影到标准化设备坐标。通常情况下,会对视锥进行一些剪裁,必要时会分割三角形。然后,所有可见的三角形投影到屏幕空间并绘制。(如雪莉《计算机图形学基础》)

另一方面,当讨论计算机图形学中的点对应的摄像机姿态估计时,透视n点问题(例如,PnP),这些算法直接估计将对象从模型空间转换为窗口坐标(例如,640x480)的摄像机矩阵

我现在的问题是这两者是如何联系在一起的。如果我从PnP算法中得到相机矩阵,它似乎不适合渲染管道。它们是如何联系在一起的?我如何正确地实现我的软件渲染器,以同时使用PnP算法中的不同摄影机矩阵

我可以想象的一件事(但这可能是一个丑陋的黑客?)是,我将提供给PnP算法的2D图像点从图像分辨率(例如[0,640])缩放到[-1,1],以“愚弄”算法,给我标准化的设备坐标,这可能给我一个渲染器可以使用的视图矩阵

虽然有一些博客文章/教程“如何将OpenCV solvePnP camera matrix转换为OpenGL”等等,但它们并不能真正帮助我理解问题的核心,这两件事是如何联系在一起的,以及当我从cv::solvePnP这样的算法中得到一个camera matrix时,如何正确实现这样的场景(在这个例子中来自OpenCV),它直接从世界转换为图像坐标,我想将这个矩阵“馈送”到我的软件渲染器,它有一个不同的“计算机图形灵感”管道


或者我在第一段中描述的软件渲染方法可能是“错误的”(意思不是最佳的)?

视图矩阵应该是摄影机矩阵的倒数

直觉是这样的:如果相机向左移动1个单位,视图矩阵需要将场景的其余部分向右移动1个单位。

你的“丑陋的黑客”实际上是正确的过程

摄像机估计程序(如PnP)基于对真实图像进行的测量,该图像由具有明确定义的传感器分辨率的真实设备生成。因此,用像素坐标表示其输出是合适的,因为这是模型及其预测误差自然表达的空间。任何其他表示,即使是双射的,也将是一个噱头实际测量的几何量


但是,一旦估计了摄影机姿势和投影模型(即,将3D点转换为像素的函数),您可以自由地将其重新映射到您喜欢的任何坐标空间,包括您指定的标准化设备坐标。

通常在计算机图形学中,有以下4x4矩阵变换:模型到世界、世界到视图、视图到屏幕。后者有时称为投影矩阵,屏幕坐标通常为零r在[-1,1]中实现

通常在计算机视觉中,“投影矩阵”是从3D世界空间映射到2D图像空间的模型到图像矩阵(通常为3x4),2D图像空间在[0,宽度]x[0,高度)中未标准化

你应该注意的一点是,如果你把你的计算机图形矩阵按正确的顺序相乘,你会得到一个4x4矩阵,它可以从模型坐标映射到标准化屏幕空间。如果你用另一个矩阵组合起来,它可以从标准化屏幕坐标到图像坐标进行缩放和转换,你会得到一些与计算机视觉投影矩阵相匹配的图像。(忽略4x4与3x4的差异。)

屏幕到图像*视图到屏幕*世界到视图*模型到世界=模型到图像

(这里我假设矩阵与左边的列向量相乘,y=Ax。有时在图形中使用相反的约定,但最好避免。您需要检查约定,如有必要,转置矩阵以在整个过程中使用相同的约定。)

计算机视觉处理事情的方法通常在数学上更方便。但是,如果要为图形管道创建单独的矩阵,可以执行以下操作:

将“模型到世界”变换设置为“标识”。提取投影矩阵的刚性部分,即摄影机旋转和平移,并将其设置为视图矩阵(世界到摄影机)。将变换的其余部分设置为投影矩阵,同时考虑标准化的屏幕空间

如果您需要详细信息,请参阅Hartley和Zisserman第二版《计算机视觉中的多视图几何》第6章

在某些情况下,一种更简单的替代方法是将除“视图到屏幕矩阵”之外的所有内容都保留为标识。然后将“世界到图像矩阵”乘以“图像到规格化屏幕”变换。生成的“世界到规格化屏幕”变换可以用作图形管道中的投影矩阵


i、 e.视图到屏幕:=图像到屏幕*模型到图像

这并不能解决我上面提到的问题/问题。PnP算法返回的摄影机矩阵在渲染管道中直接从模型到屏幕空间变换视图矩阵(渲染器在世界空间中的摄影机矩阵的倒数)是完全不同的。@Ela782:然后乘以投影矩阵的倒数,得到视图组件……我想给你奖金,你的答案非常有用。24小时的时间是w