【问题标题】:Find camera orientation && translation from 2d image从 2d 图像中查找相机方向和平移
【发布时间】:2019-10-08 04:25:31
【问题描述】:

目标 ::

我打算将上传的图像作为静态背景,并在该图像的指定平面上渲染 3d 对象。

我需要获取相机相对于平面的方向。这样我就可以在所述平面上正确渲染 3D 模型了。

用户将指定平面的长度和宽度。以及勾勒出平面的轮廓,从而得到平面的 4 个角(2D 图像上的 A、B、C、D)。


我试过的::

我研究过使用 webassembly 移植的 OpenCV,尤其是 solvePnP,但在测试时我收到了错误 Uncaught TypeError: Cannot read property '$$' of undefined at RegisteredPointer.nonConstNoSmartPtrRawPointerToWireType

我在下面使用的代码:

// 3D world coords
var vv = cv.matFromArray( 4,3,cv.CV_32SC1,[
    0,0,0,
    0,4,0,
    8,4,0,
    8,0,0,
])

// 2D img coords
var imageP = cv.matFromArray( 4,2,cv.CV_8S,[
    292,272,
    72,379,
    487,530,
    701,470,
])

// camera internal params
var cm = new cv.Mat(3,3,cv.CV_32FC1,new cv.Scalar())

var rvec
var tvec
cv.solvePnP( vv, imageP, cm, new cv.Mat(), rvec, tvec, false, cv.SOLVEPNP_P3P )

使用已知变量,是否可以收集有关相机方向/位置/FOV 的任何信息?

【问题讨论】:

  • 对于您来说,开始拥有一个已知大小的平面可能会更容易,它上面有一些唯一标识符,它是旋转不变的并且可以在任何图像中找到。从那里您将获得旋转角度,并且您可能需要从那里勾勒出平面的轮廓以找到倾斜。在获得旋转角度和倾斜后,您可以将仿射矩形映射到已知平面(使用用户输入的尺寸或最好是预先定义的尺寸),然后您可以使用仿射矩形来确定您需要进行的更改要显示的映射对象。
  • 看看solvePnP

标签: opencv 3d camera-calibration perspectivecamera


【解决方案1】:

答案有点复杂。

首先,您必须校准相机才能获得 cameraMatrix。您还应该在此过程中消除失真,

var cm = new cv.Mat(3,3,cv.CV_32FC1,new cv.Scalar())

在你的代码中,你只是声明了它,并没有给它添加任何内容。数学需要它,如下所示 那么你需要知道物体的物理尺寸才能做到这一点。

最简单的开始方法是使用棋盘校准图案样本,您可以预先输入其大小。

您可以按照此示例了解如何查找相机方向和与预定对象的相对位置。

https://docs.opencv.org/2.4/doc/tutorials/calib3d/camera_calibration/camera_calibration.html

实现你想要的源代码在这里 https://github.com/opencv/opencv/blob/master/modules/calib3d/src/calibration.cpp

从第 1400 行开始。

可以在此链接中找到带有 AR 的示例结果 https://www.youtube.com/watch?v=2hek-DmiGEw

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 2020-09-14
    • 2018-10-20
    • 2014-09-27
    • 2021-03-08
    相关资源
    最近更新 更多