在 Android 的 OpenCV 预览场景里,Camera 传感器默认输出的是横屏(LANDSCAPE)方向的图像。当把 JavaCameraView 的显示模式强行改成竖屏(PORTRAIT)时,框架需要对每一帧做额外的旋转和可能的重新采样,原因主要有三点:
硬件输出与显示方向不一致
传感器仍按横屏模式输出,而 Surface 试图以竖屏模式显示,系统只能通过旋转或裁剪来适配,这增加了 CPU/GPU 的合成负担。JNI 调用与数据拷贝开销
为了解决方向不一致,OpenCV 在每次帧处理时要多做一次 JNI 调用,并把数据从局部变量拷贝到全局变量,再进行旋转、缩放等操作;这些额外指令使处理时间变长,帧率随之下降。预览管线被阻塞
旋转和格式转换属于“阻塞操作”,会插入额外的同步点,使得 Camera 采集线程与渲染线程之间出现更长的队列,进一步降低实时性。因此,竖屏模式下不仅需要更多的计算资源,还增加了线程阻塞和数据搬运开销,最终表现为整体会掉帧、帧率降低。如果确实需要竖屏预览,可考虑:
• 使用 GPU 纹理旋转避免 CPU 拷贝;
• 在布局中直接把 Activity 设为横屏,只在需要时再旋转 UI;
• 减少每帧的 JNI 调用次数,尽量一次处理完再释放资源,以缓解帧率下降。