如何通过移动应用或浏览器获取智能手机相机内参及畸变系数?
获取智能手机相机内参及畸变系数的方法
iOS平台
原生应用开发
iOS 10及以上系统可通过AVFoundation框架的AVCaptureCameraCalibrationData类直接获取硬件标定的相机参数:
- 在拍照回调中,从
AVCapturePhoto实例提取校准数据:
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) { guard let calibrationData = photo.cameraCalibrationData else { return } // 3x3相机内参矩阵 let intrinsicMatrix = calibrationData.intrinsicMatrix // 畸变系数(通常为k1, k2, p1, p2, k3) let distortionCoefficients = calibrationData.lensDistortionCoefficients }
这些参数是硬件出厂标定值,精度较高,且对应当前拍摄会话的分辨率。
浏览器(Web)
目前Web标准未提供直接访问相机内参或畸变系数的API,浏览器出于隐私和兼容性考虑不会暴露底层硬件参数。只能通过手动标定计算:
- 用
getUserMedia获取相机视频流,页面显示棋盘格模板; - 引导用户拍摄不同角度、距离的棋盘格画面;
- 借助
OpenCV.js等前端视觉库,调用calibrateCamera算法计算参数。
Android平台
原生应用开发
Android 5.0(API 21)及以上推荐用Camera2 API获取硬件标定参数:
- 通过
CameraManager读取相机特性中的参数:
val cameraManager = getSystemService(Context.CAMERA_SERVICE) as CameraManager val cameraId = "0" // 0为后置摄像头,1为前置 val characteristics = cameraManager.getCameraCharacteristics(cameraId) // 3x3内参矩阵(数组顺序:fx, 0, cx, 0, fy, cy, 0, 0, 1) val intrinsicParams = characteristics.get(CameraCharacteristics.KEY_LENS_INTRINSIC_PARAMETERS) // 畸变系数(数组顺序:k1, k2, p1, p2, k3) val distortionParams = characteristics.get(CameraCharacteristics.KEY_LENS_DISTORTION)
注意:参数对应相机默认分辨率,使用自定义分辨率时需确认部分设备是否需要重新映射。
浏览器(Web)
与iOS Web场景一致,无原生API支持直接获取参数。解决方案为前端手动标定:
- 通过
navigator.mediaDevices.getUserMedia获取相机流; - 加载
OpenCV.js实现棋盘格标定流程; - 收集足够样本后调用算法计算内参和畸变系数。
注意事项
- 原生应用获取的参数是硬件出厂标定值,精度远高于手动标定;
- 同一设备的前后置摄像头参数完全不同,需分别获取;
- 手动标定时,样本数量、拍摄角度、光照条件会直接影响结果精度。
内容的提问来源于stack exchange,提问作者Ayo
相关产品推荐
相关产品推荐

