opencv - OpenCV 相机校准矩阵与 OpenGL 投影矩阵之间的相关性
问题描述
我很难渲染一个具有相同尺寸和比例的 .stl 模型,在真实对象的图片中可视化。我将真实物体放在视图区域的中心,我想在模型和真实物体之间翻转(真实物体比模型中的一个小 9 倍)。
首先,我在教程中使用 OpenGL 校准相机,此时焦点对真实对象是最佳的。在获得 cx、cy、fx 和 fy 值后,我使用这些值创建一个透视矩阵,并使用 glMultMatrixd 函数。最后,我将照片调整为与我的 OpenGL 窗口相同的大小,并将照片与渲染模型进行比较。
但我对结果有一些问题:
- 有比例失真(比高宽)
- 存在透视失真(相机与物体垂直,所以我应该只查看物体的顶部,但它显示的是物体的侧面)
- 尺寸与实物不符(稍小)
我的关系矩阵如下:
GLdouble perspMatrix[16] = { fx / cx, 0 , 0 , 0,
0, fy / cy , 0 , 0,
0, 0 , -(znear + zfar) / (znear - zfar), 2 * zfar*znear / (zfar - znear),
0, 0 , -1 , 0 };
解决方案
OpenGL 需要以列优先的内存顺序排列矩阵。您在上面显示的数据结构是按行优先的内存顺序(正常的写入顺序,OpenCV 也将其用作内存顺序),因此您需要在传递给 OpenGL 之前对其进行转置。
您还构建了一个对称的视锥体(右==左==cx 和上==下==cy),它假设光轴(cx,cy)位于相机成像器的中心。真正的相机从未如此完美,这就是我们必须校准它们的原因。你需要一个不对称的平截头体,使用left==cx、right==(width-cx)等;本指南应该有所帮助。
请注意,在 OpenGL 中,+Y 向上,+Z 位于相机后面(在 OpenCV 中,+Y 向下,+Z 位于相机前面),因此请检查矩阵上的符号。
推荐阅读
- java - Java 8 Stream,如何获得前 N 个计数?
- mysql - 无法读取未定义错误的属性“查询”:mysql 和 node.js
- reactjs - React => Uncaught URIError:这可能是由无效的百分比编码引起的。使固定
- javascript - how code splitting works with import/export and babel and webpack?
- javascript - 每次按键都会重置数组
- arrays - 将json文本传递给api
- javascript - Javascript import module to index.html not running due to errors
- c++ - 基本类型和类类型之间的性能差异
- reactjs - webpack 3.8.1 facebook react import node module css not working
- javascript - 在 HTML 中将控制器操作的进度显示为文本