MediaPipe安卓App横屏模式下相机旋转90度问题解决方案咨询
MediaPipe 安卓横屏模式相机朝向错误解决方案
1. 校准相机旋转角度计算逻辑
- 首先通过
CameraManager获取当前启用摄像头的传感器原生朝向:调用getCameraCharacteristics(cameraId)方法,读取SENSOR_ORIENTATION参数,常规后置摄像头默认值为90°,前置摄像头默认值为270°。 - 结合当前屏幕朝向动态计算需要补偿的旋转值,参考计算逻辑如下:
int getCameraCompensationRotation(boolean isFrontCamera) { int displayRotation = getWindowManager().getDefaultDisplay().getRotation(); int sensorOrientation = cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); int rotationOffset; if (isFrontCamera) { rotationOffset = (sensorOrientation + displayRotation * 90) % 360; rotationOffset = (360 - rotationOffset) % 360; } else { rotationOffset = (sensorOrientation - displayRotation * 90 + 360) % 360; } return rotationOffset; }
2. 预处理MediaPipe输入帧
- 若使用自定义相机实现,在将相机帧传入MediaPipe Graph之前,对
Image/Bitmap对象应用上面计算得到的旋转角度,保证传入MediaPipe的帧方向正确。 - 若使用MediaPipe官方提供的相机集成组件(Camera2/CameraX绑定组件),直接将计算得到的旋转值传入组件的
setRotation()方法即可,无需手动处理帧旋转。
3. 调整输出渲染变换矩阵
- 如果你不需要修改输入帧方向(避免影响 landmark 检测坐标的后续计算),可以仅调整输出渲染阶段的变换矩阵:在
GlSurfaceView的渲染回调中,给纹理绘制矩阵设置对应角度的旋转,再渲染到屏幕上。 - 横屏切换时同步调整渲染控件的宽高比,和相机输出帧的宽高比保持一致,避免画面拉伸变形。
注意事项
- 横竖屏切换回调触发时,需要重新计算旋转补偿值,同步更新到MediaPipe的输入、渲染模块,不要仅在应用初始化时计算一次。
- 前置摄像头需要额外添加镜像翻转处理,避免预览画面和用户实际动作方向相反。
内容的提问来源于stack exchange,提问作者christy varghese
相关产品推荐
相关产品推荐

