Iphone 6相机校准OpenCV

我正在开发一个使用OpenCV的iOS增强现实应用程序。 我在创build相机投影matrix时遇到了问题,以允许OpenGL叠加层直接映射到标记顶部。 我觉得这是由于我的iPhone 6相机没有正确地校准到应用程序。 我知道有OpenCV代码校准摄像头等使用国际象棋板,但我找不到一种方法来校准我的embedded式iPhone摄像头。

有没有办法? 或者是否有iPhone 6的估算值? 其中包括:x和y的焦距,x和y的主点以及畸变系数matrix。

任何帮助将不胜感激。

编辑:

推导值如下(使用iPhone 6,摄像头分辨率1280×720):

fx=1229 cx=360 fy=1153 cy=640 

此代码提供了当前运行iOS 9.1的设备的焦距和主要点的准确估计。

 AVCaptureDeviceFormat *format = deviceInput.device.activeFormat; CMFormatDescriptionRef fDesc = format.formatDescription; CGSize dim = CMVideoFormatDescriptionGetPresentationDimensions(fDesc, true, true); float cx = float(dim.width) / 2.0; float cy = float(dim.height) / 2.0; float HFOV = format.videoFieldOfView; float VFOV = ((HFOV)/cx)*cy; float fx = abs(float(dim.width) / (2 * tan(HFOV / 180 * float(M_PI) / 2))); float fy = abs(float(dim.height) / (2 * tan(VFOV / 180 * float(M_PI) / 2))); 

注意:

我有这个代码的初始化问题。 我build议一旦这些值被初始化并正确设置,将它们保存到一个数据文件并读取这个文件的值。

在我的非OpenCV AR应用程序中,我使用iPhone相机的视场(FOV)来构build相机投影matrix。 它可以正常显示覆盖在摄像机视图顶部的太阳path。 我不知道你需要多less精度。 可能只知道FOV是不够的。

iOS API提供了一种获取相机视野的方法。 我明白这一点:

 AVCaptureDevice * camera = ... AVCaptureDeviceFormat * format = camera.activeFormat; float fieldOfView = format.videoFieldOfView; 

得到FOV后,我计算投影matrix:

 typedef double mat4f_t[16]; // 4x4 matrix in column major order mat4f_t projection; createProjectionMatrix(projection, GRAD_TO_RAD(fieldOfView), viewSize.width/viewSize.height, 5.0f, 1000.0f); 

哪里

 void createProjectionMatrix( mat4f_t mout, float fovy, float aspect, float zNear, float zFar) { float f = 1.0f / tanf(fovy/2.0f); mout[0] = f / aspect; mout[1] = 0.0f; mout[2] = 0.0f; mout[3] = 0.0f; mout[4] = 0.0f; mout[5] = f; mout[6] = 0.0f; mout[7] = 0.0f; mout[8] = 0.0f; mout[9] = 0.0f; mout[10] = (zFar+zNear) / (zNear-zFar); mout[11] = -1.0f; mout[12] = 0.0f; mout[13] = 0.0f; mout[14] = 2 * zFar * zNear / (zNear-zFar); mout[15] = 0.0f; }