我的相机应用程序使用OpenCV处理来自onPreviewFrame()
的原始相机帧,然后在屏幕上显示它们。但是,原始帧的方向与摄像机安装在手机上的方式相同,通常不是正面朝上。为了解决这个问题,我使用OpenCV手动旋转它们,这非常耗时。
我已经研究过使用setDisplayOrientation,但文档说明了
这不会影响onPreviewFrame传递的字节数组的顺序
我需要将数据实际 正面朝上,而不是只显示正面朝上。如何正确定位原始相机数据?如果这是不可能的,我可以在onPreviewFrame()
中有效地旋转传递给我的字节数组,比如使用OpenGL吗?
答案 0 :(得分:3)
不,没有办法让API为您执行此操作,但要弄清楚如何旋转数据,请查看Camera.Parameters.setRotation处的示例代码。虽然setRotation()仅影响JPEG,但您希望对onPreviewFrame()中获得的数据应用与JPEG相同的旋转量。
在此处重现示例代码,稍作修改:
public void onOrientationChanged(int orientation) {
if (orientation == ORIENTATION_UNKNOWN) return;
android.hardware.Camera.CameraInfo info =
new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(cameraId, info);
orientation = (orientation + 45) / 90 * 90;
int rotation = 0;
if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
rotation = (info.orientation - orientation + 360) % 360;
} else { // back-facing camera
rotation = (info.orientation + orientation) % 360;
}
mCameraOrientation = rotation; // Store rotation for later use
}
...
void onPreviewFrame(byte[] data, Camera camera) {
switch(mCameraOrientation) {
case 0:
// data is correctly rotated
break;
case 90:
// rotate data by 90 degrees clockwise
case 180:
// rotate data upside down
case 270:
// rotate data by 90 degrees counterclockwise
}
}
因此,您需要继承OrientationEventListener并覆盖onOrientationChanged,然后使用计算出的方向值来旋转预览帧。
答案 1 :(得分:1)
setDisplayOrientation
只会旋转相机与正在绘制的表面。
我相信您想要旋转相机解释,使用setRotation