Android onPreviewFrame()回调中的图片方向不正确?

时间:2017-11-29 06:54:21

标签: android opencv image-processing java-native-interface

我使用了setPreviewCallbackWithBuffer并在onPreviewFrame()回调中获得了视频帧像素数据。字节数据为 YUV NV21 格式并旋转90度。我确实知道如何将预览帧从 YUV 转换为 RGB 并将其旋转回来。但是花了我不需要的时间(大约20ms),因为我之后有很多图像处理任务。我应该如何配置相机参数或做任何其他事情来获得正确的方向视频帧而无需我的旋转和放大转换代码?

2 个答案:

答案 0 :(得分:1)

您可以使用Camera.setDisplayOrientation()基本免费修复屏幕上的相机实时预览方向,但不会影响JPEG图片或录制的视频。

其他相关方法是setRotation(),适用于捕获的JPEG图片,setOrientationHint()适用于MediaRecorder。

但这些方法都不会影响传递给preview callbacks的字节数组的顺序。即使是新的 camera2 API也无法解决此问题。

如果您需要,您无需通过RGB旋转NV21帧。这种字节操作比颜色转换快得多,但仍需要时间。如果您有图像处理(如标记所示),我建议调整图像处理算法以接受旋转图像。如果更改算法部分太麻烦了,但是你的图像处理程序是用C ++编写的,那么如果你用C ++编写YUV旋转,你会看到性能提升。

答案 1 :(得分:0)

像这样设置相机方向

 private int compensateCameraRotation(int uiRotation) {

    int currentDeviceOrientation = 0;
    switch (uiRotation) {
        case (Surface.ROTATION_0):
            currentDeviceOrientation = 0;
            break;
        case (Surface.ROTATION_90):
            currentDeviceOrientation = 270;
            break;
        case (Surface.ROTATION_180):
            currentDeviceOrientation = 180;
            break;
        case (Surface.ROTATION_270):
            currentDeviceOrientation = 90;
            break;
        default:
            break;
    }

初始化相机时,您可以像这样设置它

 Camera.Parameters parameters = camera.getParameters();
        parameters.setRotation(compensateCameraRotation(currentDisplay
                .getRotation()));

在currentDisplay是显示对象的地方,您可以通过调用

来获取它
WindowManager windowManager = (WindowManager) context
            .getSystemService(Context.WINDOW_SERVICE);
currentDisplay = windowManager.getDefaultDisplay();

像这样设置您的相机属性最近,我遇到了同样的问题,我可以通过设置这样的属性来解决它。