Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCV投影点和Unity摄影机视图之间不匹配_Opencv_Unity3d_Computer Vision_Pose Estimation_Opencv Solvepnp - Fatal编程技术网

OpenCV投影点和Unity摄影机视图之间不匹配

OpenCV投影点和Unity摄影机视图之间不匹配,opencv,unity3d,computer-vision,pose-estimation,opencv-solvepnp,Opencv,Unity3d,Computer Vision,Pose Estimation,Opencv Solvepnp,我们正在开发一个AR应用程序,其中我们需要在对象的视频流上覆盖对象的3D模型。Unity场景包含3D模型,相机正在拍摄3D对象。摄影机姿势最初未知 ▶ 我们已经尝试过的 我们没有找到一个很好的解决方案来直接统一估计相机姿势。因此,我们使用它提供了大量的计算机视觉功能库。特别是,我们定位并将其匹配的3D-2D坐标传递给 solvePnp返回与现实一致的相机位置,最长可达几厘米。我们还验证了低重投影误差 每个使用过的标签角都会重新投影,并在图像上显示为红色点。正如你所看到的,差别很小 这些结果看起

我们正在开发一个AR应用程序,其中我们需要在对象的视频流上覆盖对象的3D模型。Unity场景包含3D模型,相机正在拍摄3D对象。摄影机姿势最初未知

我们已经尝试过的

我们没有找到一个很好的解决方案来直接统一估计相机姿势。因此,我们使用它提供了大量的计算机视觉功能库。特别是,我们定位并将其匹配的3D-2D坐标传递给

solvePnp
返回与现实一致的相机位置,最长可达几厘米。我们还验证了低重投影误差

每个使用过的标签角都会重新投影,并在图像上显示为红色点。正如你所看到的,差别很小

这些结果看起来不错,对于我们的用例来说应该足够了。 因此,我们根据真实感和OpenCV验证相机姿势

问题

但是,在Unity场景中将摄影机放置在估计姿势时,3D对象不会很好地对齐

在这个Unity屏幕截图上,您可以看到虚拟(Unity对象)绿色标记的视图与视频提要中的真实标记不匹配

可能的根本原因

我们确定了可能解释Unity和OpenCV之间不匹配的不同根本原因:

  • 相机内在参数的差异:我们尝试了不同的参数集,没有一个绝对成功。我们首先用OpenCV校准了相机,并尝试重新校准。我们也查看了制造商的数据,但没有提供更好的结果。最后,我们手动测量视场(FoV),并将其与已知的相机传感器尺寸相结合。这些测试的结果差别不大
  • Unity和OpenCV之间相机模型的差异:OpenCV使用的是a,但我无法找到Unity模拟哪个模型的结论性答案
注释

我们的相机视野很大(115°)

传递给OpenCV和Unity的图像都没有失真

我们讨论了大多数标记为OpenCV和Unity的SO问题。关于不同的坐标系和旋转约定。在我们的例子中,这似乎不是问题,因为摄影机显示在3D Unity场景中的预期位置

问题

  • Unity和OpenCV使用的相机模型有什么根本区别吗
  • 你有没有看到其他可能的原因可以解释Unity和OpenCV在投影上的差异
  • 你知道在没有OpenCV的情况下有什么可靠的方法来估计相机的姿势吗

  • 相机的本质是我的第一个猜测。你做了失真校正吗?这对于宽视场摄像机非常重要。在计算完内部和失真参数后,您必须取消图像的失真是的,我们尝试了两种不同的失真校正。第一个是来自OpenCV校准轮30幅图像的数据。结果稍差。这个问题中的图像是不失真的,创建了一个UV贴图来拉直拍摄的棋盘上的线条,这样它就可以拍摄整个图像。生成的未失真图像在视觉上令人愉悦,并具有预期的特征(平行线等)。我怀疑这个错误是由于不失真造成的,但我会再看一眼!失真校正后(假设未失真的图像是您的实际相机图像),您是否执行了intrinsics(K矩阵)和solvePnp?我们同时执行了这两项操作。首先,我们使用失真图像(这导致失真系数矩阵中的值更高)。该项目的当前状态是使用未失真的图像,因此失真系数较低。如果我们使用未失真的图像,会有任何错误吗?根据我的经验,这是由于openCV计算和Unity中使用的值之间的焦距差异造成的。在计算重投影矩阵和重投影unity 3D对象以观察变化方向时,可以尝试在相机固有值中主动更改fx和fy的值。