【发布时间】: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