为iPhone 5 solvepnp创建opencv相机矩阵

Isa*_*aac 9 iphone opencv computer-vision augmented-reality camera-calibration

我正在使用opencv为iPhone开发应用程序.我必须使用方法solvePnPRansac:

http://opencv.willowgarage.com/documentation/cpp/camera_calibration_and_3d_reconstruction.html

对于这种方法,我需要提供一个相机矩阵:
__ __
| fx 0 cx |
| 0 fy cy |
| _0 0 1 _ |

其中cx和cy代表图像的中心像素位置,fx和fy代表焦距,但这就是文档中所说的.我不确定这些焦距应该提供什么.iPhone 5的焦距为4.1毫米,但我不认为这个值可以按原样使用.

我检查了另一个网站:

http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html

这显示了opencv如何创建相机矩阵.这里说明焦距是以像素为单位测量的.

我检查了另一个网站:

http://www.velocityreviews.com/forums/t500283-focal-length-in-pixels.html

(大约一半)它表示可以使用以下公式将焦距从毫米单位转换为像素:fx = fy = focalMM*pixelDensity/25.4;

另一个链接我发现fx = focalMM*width /(sensorSizeMM); fy = focalMM*length /(sensorSizeMM);

我不确定这些方程式以及如何正确地创建这个矩阵.

任何有关如何创建精确相机矩阵(特别是iPhone 5)的帮助,建议或链接将不胜感激,

艾萨克

ps我认为(fx/fy)或(fy/fx)可能等于相机的纵横比,但这可能完全错误.

更新:

像素坐标到3D线(opencv)

使用这个链接,我可以弄清楚他们是如何想要fx和fy格式化的,因为他们使用它来相对于它们与中心的距离来缩放角度.因此,fx和fy很可能是像素/(单位长度),但我仍然不确定这个单位长度需要什么,只要x和y相互缩放,它是否可以是任意的?

Fra*_*ari 10

你可以得到像素的焦距的初始(粗略)估计,将焦距除以相机的传感器像素(CCD,CMOS等)的宽度.

您可以从相机手册中获取前者,或者从以全分辨率拍摄的图像的EXIF标题中读取它.找出后者有点复杂:如果你知道它的制造商和型号,你可以查看传感器规格表的互联网,或者你可以将其敏感区域的整体宽度除以上面的像素数.侧.

没有其他信息,通常可以安全地假设像素是方形(即fx == fy),并且传感器与镜头的焦轴正交(即相机矩阵的第一行和第二列中的术语是零).此外,如果没有经过精心设计的校准装置,并且经过精心执行的校准程序(因为它们与平行于图像的相机平移本质上混淆),主点(cx,cy)的像素坐标通常很难准确估计.平面).因此,最好将它们设置为等于图像的几何几何中心,除非您知道图像已经被非对称地裁剪.

因此,您最简单的相机模型只有一个未知参数,焦距f = fx = fy.

忠告:在你的应用程序中通常更方便携带水平(或垂直)视场角度,而不是像素的焦距.这是因为FOV对图像缩放是不变的.


Mil*_*ilo 6

你在这里处理的"焦距"只是从世界上的物体到相机像素的比例因子,用于针孔相机模型(维基百科链接).这就是为什么它的单位是像素/单位长度.对于给定的f,在距离(垂直于相机)z处的尺寸L的对象将是f*L/z像素.

因此,您可以通过将已知大小的物体放置在相机的已知距离并测量其在图像中的大小来估计焦距.您可以假设中心点是图像的中心.你绝对不应该忽略镜头失真(dist_coef参数solvePnPRansac).

在实践中,获得相机矩阵和失真系数的最佳方法是使用相机校准工具.您可以下载和使用MRPT camera_calib软件这个环节,还有一个视频教程在这里.如果您使用matlab,请转到相机校准工具箱.

  • @Isaac:我不知道Iphone 5的任何预制相机矩阵,但您可以为您发布校准结果;-) (3认同)