增强现实技术的OpenGL+OpenCV应用

5

我对OpenCV完全是新手,OpenGL的经验也很有限。我想在校准后的棋盘图像上叠加一个3D对象。是否有任何提示或指导?


1
“校准”是什么意思?您是否指每个棋盘方格的每条边的长度与某些有用的度量相关(即,1个边长= 1英尺/英寸/米等)? - redsoxfantom
我的意思是我正在执行相机校准,棋盘格是校准物体。现在我想使用openGL在校准物体上渲染2D或3D对象。 - user3303396
啊,好的。抱歉,我不是很清楚能在那方面帮到你,试试scap3y的回答吧。 - redsoxfantom
1个回答

20
基本思想是你有两个相机:一个是物理相机(用OpenCV检索图像的相机),另一个是OpenGL相机。你需要对齐这两个矩阵。
为此,您需要校准物理相机。
首先,您需要畸变参数(因为每个镜头都有一些光学失真),并使用这些参数构建所谓的内部参数。您可以在纸上打印棋盘,并使用它获取一些图像并校准相机。互联网上有很多不错的教程,从您的回答中看来您也知道它们。那很好。
然后,您必须校准相机的位置。这是通过所谓的外部参数完成的。这些参数编码了相机在3D世界中的位置和旋转。
在OpenCV方法cv :: solvePnP和cv :: Rodrigues中需要内部参数,Rodrigues方法用于获取外部参数。该方法输入2组相应点:一些已知的3D点及其2D投影。这就是为什么所有增强现实应用程序都需要一些标记:通常标记是正方形的,因此在检测到它之后,您知道由P1(0,0,0)P2(0,1,0)P3(1,1,0)P4(1,0,0)形成的正方形的2D投影,您可以找到铺在它们上面的平面。
一旦您获得了外部参数,整个游戏就很容易解决:您只需使用内部参数中相机的视场和光圈角进行OpenGL透视投影,并将相机放置在外部参数给出的位置即可。

当然,如果你想(而且你应该)正确理解和处理此过程的每个步骤...需要使用大量的数学知识 - 矩阵、角度、四元数、矩阵再次出现,以及...再次出现的矩阵。你可以在著名的R. Hartley和A. Zisserman的 《计算机视觉中的多视图几何》中找到参考资料。

此外,要正确处理opengl部分,您必须处理所谓的“现代OpenGL”(请记住glLoadMatrix已被弃用),并稍微了解一下着色器以加载相机位置的矩阵(对我来说,这是一个问题,因为我对此一无所知)。

我曾经处理过这个问题,有一些代码,所以随时问任何类型的问题。以下是一些我发现有趣的链接:

  1. http://ksimek.github.io/2012/08/14/decompose/ (非常好的解释)
  2. 从cv :: solvePnP得到相机在世界坐标系中的位置(我提出的问题)
  3. http://www.morethantechnical.com/2010/11/10/20-lines-ar-in-opencv-wcode/ (关于计算机视觉的精彩博客)
  4. http://spottrlabs.blogspot.it/2012/07/opencv-and-opengl-not-always-friends.html (不错的技巧)
  5. http://strawlab.org/2011/11/05/augmented-reality-with-OpenGL/ 这篇文章介绍了如何使用OpenGL实现增强现实应用程序,其中涉及到的技术包括相机标定、图像处理和3D渲染等。
  6. http://www.songho.ca/opengl/gl_projectionmatrix.html(非常好的关于OpenGL相机设置基础的解释)
  7. 这篇文章提供了有关OpenGL相机矩阵的详细解释和示例代码,有助于理解如何进行视角转换和投影变换等操作。
  8. 其他一些随机而有用的东西: http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html(文档,始终查看文档!!!) 利用OpenCV确定外部相机状态并将其映射到OpenGL世界空间中的对象 罗德里格斯和欧拉角的相互转换 Python Opencv SolvePnP产生错误的平移向量 使用SolvePnP实现正确的OpenCV和OpenGL相机姿态

在开始之前请先阅读它们。一旦掌握了概念,就非常简单,只需要稍微思考一下。不要害怕那些数学:)


嘿,我按照你的指示尝试了一下,但是遇到了一个问题,你介意看一下我的帖子吗? - Carpetfizz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接