我是OpenCV的新手,在OpenGL上的经验有限。我愿意把一个三维物体叠加在棋盘的校准图像上。有什么建议或指导吗?
基本思想是您有两个相机:一个是物理相机(使用opencv检索图像的相机),另一个是opengl相机。你必须把这两个矩阵对齐。
要做到这一点,您需要校准物理相机。
首先。您需要失真参数(因为每个镜头或多或少都有一些光学失真),并使用这些参数构建所谓的内在参数。您可以在纸上打印棋盘,用它来获取一些图像并校准相机。网上有很多关于这方面的教程,从你的回答来看,你似乎已经掌握了。太好了。
然后。你必须校准相机的位置。这是通过所谓的外在参数来完成的。这些参数编码了这些相机的3D世界的位置和旋转。
OpenCV方法cv::solvePnP
和cv::Rodrigues
需要内部参数,并使用rodrigues方法来获得外部参数。该方法输入2组对应点:一些三维已知点及其二维投影。这就是为什么所有增强现实应用程序都需要一些标记:通常标记是正方形的,所以在检测到它之后,你就知道了点P1(0,0,0)P2(0,1,0)P3(1,1,0)P4(1,0,0)的2D投影,它形成了一个正方形,你可以找到位于它们上面的平面。
一旦你有了外部参数,所有的游戏都很容易解决:你只需要在OpenGL中用FoV和相机的光圈角从内部参数进行透视投影,然后把相机放在外部参数给定的位置。
当然,如果你想(也应该)正确理解和处理这个过程的每一步。。有很多数学——矩阵、角度、四元数、矩阵等等。。矩阵。你可以在R.Hartley和a.Zisserman的著名的《计算机视觉中的多视图几何》中找到参考资料。
此外,为了正确处理opengl部分,您必须处理所谓的"现代opengl"(请记住,glLoadMatrix
已被弃用)和一点用于加载相机位置矩阵的着色器(对我来说,这是一个问题,因为我对此一无所知)。
我以前已经处理过这个问题,我有一些代码,所以可以随意问你有什么问题。以下是我感兴趣的一些链接:
- http://ksimek.github.io/2012/08/14/decompose/(解释得很好)
- 摄像机在世界坐标系中的位置来自cv::solvePnP(我问过这个问题)
- http://www.morethantechnical.com/2010/11/10/20-lines-ar-in-opencv-wcode/(关于计算机视觉的精彩博客)
- http://spottrlabs.blogspot.it/2012/07/opencv-and-opengl-not-always-friends.html(妙招)http://strawlab.org/2011/11/05/augmented-reality-with-OpenGL/
- http://www.songho.ca/opengl/gl_projectionmatrix.html(很好地解释了opengl相机设置的基本原理)
- 一些其他随机有用的东西:http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html(文档,请始终查看文档!!)用opencv到opengl确定具有世界空间对象的外部摄像机罗德里格斯进入欧拉角,反之亦然Python Opencv SolvePnP产生错误的翻译矢量http://answers.opencv.org/question/23089/opencv-opengl-proper-camera-pose-using-solvepnp/
请在阅读之前先阅读它们。和往常一样,一旦你明白了这个概念,这就是一个简单的笑话,你需要把你的大脑撞到墙上。只是不要害怕所有这些数学:)