2016-01-23 158 views
4

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

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

任何帮助将不胜感激。

编辑:

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

该代码提供焦距为设备的准确估计和主点:

如下(使用iPhone 6,相机馈送分辨率1280×720)推导的值目前运行的是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))); 

注:

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

+1

非常感谢这一点。 – nnrales

回答

4

在我的非OpenCV AR应用程序中,我使用iPhone摄像头的视场(FOV)构造摄像头投影矩阵。它可以正常显示覆盖在摄像机视图顶部的太阳路径。 我不知道你需要多少准确性。这可能是因为只知道FOV是不够的。

iOS API提供了一种获取相机视野的方法。我得到它像这样:

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

得到FOV后,我计算投影矩阵:

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; 
} 
+0

不幸的是,校准不是我AR应用程序的主要问题,所以非常感谢您提供了创建相机投影矩阵的方法;但我还没有找到主错误。 – User7710

+0

@ User1994没问题......也许其他人会发现这个答案有用..好像找到你“主错误”:) – euvs

+0

原来,这是我的校准问题。调整你提供给我的代码后,我发现了这个问题。在调试时,第一次调用此代码的封装方法时,显然某些变量未初始化,并将校准设置为不正确的值。在第二次迭代中,这些值现在被初始化并返回正确的值。这些代表fx,fy,cx和cy的数据现在已被记录下来并放入数据文件中以解决问题。谢谢你的帮助。 – User7710