nas*_*ass 6 c++ camera opencv projection
我见过很多的博客文章和视频,并源折轴有关如何使用OpenCV的执行相机+投影机标定在互联网上,以生产camera.yml,projector.yml和projectorExtrinsics.yml文件.
我之后还没有看到有人讨论如何处理这些文件.事实上,我自己做过校准,但我不知道自己应用程序的下一步是什么.
假设我编写的应用程序现在使用相机 - 我校准的投影仪系统来跟踪对象并在其上投影.我将使用contourFind()从移动物体中抓取一些感兴趣的点,现在我想将这些点(从投影仪!)投射到物体上!
我想要做的是(例如)跟踪对象的质心(COM)并在跟踪对象的摄像机视图上显示一个点(在其COM处).然后应该在物体的COM上实时投射一个点.
这似乎projectPoints()是我在加载yml文件后应该使用的openCV函数,但我不确定如何考虑相机和投影仪的所有内在和外在校准值.即,projectPoints()需要作为参数
因此,如果我使用投影仪或相机(哪一个??)内在函数+系数projectPoints(),那么我只会'纠正'2个乐器中的一个.我在哪里/如何使用对方的内在函数?
除了load()yml文件之外我还需要使用 projectPoints()什么?(也许是不成正比的?)
非常感谢任何有关此事的帮助.如果有教程或书籍(不,O'Reilly"学习openCV"也没有谈论如何使用校准yml文件! - 仅关于如何进行实际校准),请指出我的方向.我不一定需要一个确切的答案!
首先,您似乎对相机/投影仪模型的一般作用感到困惑:它的作用是将 3D 世界点映射到 2D 图像点。这听起来很明显,但这意味着给定外部参数 R,t(用于方向和位置)、畸变函数 D(.) 和内部参数 K,您可以针对该特定相机推断 3D 点 M 的 2D 投影 m,如下所示: = KD(R.M+t)。对于每个输入 3D 点,该projectPoints函数正是执行此操作(即 3D 到 2D 投影),因此您需要为其提供与希望投影 3D 点的相机关联的输入参数(如果您想要投影仪 2D 坐标,则为投影仪 K&D,相机 K&D(如果您想要相机 2D 坐标)。
其次,当您联合校准相机和投影仪时,您不会估计相机的一组外参 R,t 和投影仪的另一组外参 R,t,而只估计一个 R 和一个 t,它们代表相机和投影仪之间的旋转和平移。坐标系。例如,这意味着假设您的相机的旋转 = 恒等和平移 = 0,并且投影仪的旋转 = R 和平移 = t (或相反,取决于您如何进行校准)。
现在,关于您提到的应用程序,真正的问题是:如何估计给定点的 3D 坐标?
使用两台相机和一台投影仪,这将很容易:您可以跟踪两个相机图像中感兴趣的对象,使用函数使用两个 2D 投影对它们的 3D 位置进行三角测量,最后使用in ordertriangulatePoints在投影仪 2D 坐标中投影这个 3D 点projectPoints了解投影仪在哪里显示内容。
仅使用一台摄像机和一台投影仪,这仍然是可能的,但更加困难,因为您无法仅根据一次观察对跟踪点进行三角测量。基本思想是像稀疏立体视差估计问题一样处理该问题。一种可能的方法如下:
使用投影仪投射清晰的图像(例如黑白噪声),以便对相机观察到的场景进行纹理化。
和以前一样,跟踪相机图像中感兴趣的对象
对于每个感兴趣的对象,将相机图像中其位置周围的小窗口与投影仪图像相关联,以便找到它在投影仪 2D 坐标中的投影位置
stereoRectify另一种方法与上面使用校准参数的方法不同,可以使用和StereoBM::operator()(或gpu::StereoBM_GPU::operator()对于 GPU 实现)进行密集 3D 重建,使用估计的场景深度将跟踪的 2D 位置映射到 3D,最后投影到投影仪使用projectPoints.
无论如何,使用两个摄像头更容易、更准确。
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
3724 次 |
| 最近记录: |