我正在尝试为android制作一个AR应用程序,用户将相机指向正方形标记,3d模型应显示在标记的顶部。
我使用OpenCV来获取标记的旋转和平移,但是..
为了得到这两个矩阵,我使用了solvePnP,我必须为它提供一个相机矩阵和一个失真矩阵,据我所知,这两个矩阵对于每种相机类型都是特定的。不幸的是,这对我来说是一个巨大的缺点,因为大多数安卓设备都应该支持这款应用,而且我也不能要求用户运行摄像头校准程序(由openCV提供的功能)。
那么问题是:有没有一种方法可以消除相机和失真矩阵?或者,有没有其他方法可以计算标记相对于设备的3D位置?
我试过QCAR和Unity AR,但(因为3D模型是从服务器上下载的,而且不断变化),我被迫使用OpenCV。
任何帮助都将不胜感激。
谢谢。
发布于 2012-01-12 07:33:13
对你来说是个坏消息。答案是一个明确的、不可撤销的、巨大的不。
如果你对你的相机一无所知,你真的无法知道任何关于你的图像的事情。相机由两个矩阵来描述:相机垫和失真垫。
但是..。除了坏消息,还有一些好消息。也许你能做点什么。
在许多AR应用中,失真矩阵可以忽略不计。你就是不关心小的扭曲。
如果你知道摄像机的视野,摄像机矩阵可以很容易地构造出来:
w/(2*tan(camera.fovX())), 0, w/2, 0,
0, h/(2*tan(camera.fovY())), h/2, 0,
0, 0, 1, 0
现在,你会说你已经变好变坏了:你需要相机fov,为此你需要校准。好消息是,在android上你可以使用getHorizontalAperture()
和getVerticalAperture()
,或者别的什么。孔径==视场。
最后,真正的坏消息是:在许多手机上,返回值是不正确的。因为制造商并不关心它。它返回假角度: 10度,180度,等等。
祝你好运!
https://stackoverflow.com/questions/8824126
复制相似问题