我正在使用 OpenCV 开发 iOS 增强现实应用程序。我在创建相机投影矩阵以允许 OpenGL 叠加层直接映射到标记顶部时遇到问题。我觉得这是因为我的 iPhone 6 摄像头没有根据应用程序正确校准。我知道有 OpenCV 代码可以使用棋盘校准网络摄像头等,但我找不到校准我的嵌入式 iPhone 摄像头的方法。
有办法吗?或者 iPhone 6 有已知的预估价格吗?其中包括:x 和 y 中的焦距、x 和 y 中的主点以及畸变系数矩阵。
任何帮助将不胜感激。
EDIT:
推导值如下(使用iPhone 6,摄像头分辨率1280x720):
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)));
NOTE:
我遇到了此代码的初始化问题。我建议在初始化并正确设置值后,将它们保存到数据文件中并读取该文件以获取值。
在我的非 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);
where
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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)