【问题标题】:Correctly orient raw camera data正确定位原始相机数据
【发布时间】:2013-04-25 21:28:43
【问题描述】:

我的相机应用程序使用 OpenCV 处理来自 onPreviewFrame() 的原始相机帧,然后将它们显示在屏幕上。但是,原始帧的方向与相机安装在手机上的方式相同,通常不是正面朝上。为了解决这个问题,我使用 OpenCV 手动旋转它们,这很耗时。

我已经研究过使用 setDisplayOrientation,但文档指出

这不会影响onPreviewFrame传入的字节数组的顺序

我需要数据实际上是 正面朝上,而不仅仅是正面朝上显示。如何正确定位原始相机数据?如果这是不可能的,我是否可以有效地旋转在onPreviewFrame() 中传递给我的字节数组,比如使用 OpenGL?

【问题讨论】:

    标签: android android-camera


    【解决方案1】:

    不,没有办法让 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,然后使用从那里计算出来的方向值来旋转预览帧。

    【讨论】:

      【解决方案2】:

      setDisplayOrientation 如果我没记错的话,只会旋转相机与您正在绘制的表面。 我相信你想旋转相机解释,你可以用setRotation实现什么

      【讨论】:

      • 我以前见过这个,但它说This affects the pictures returned from JPEG Camera.PictureCallback. 即使你不使用这个回调,它也会旋转原始数据吗?
      • 原始数据不能被操纵,因为它正是传感器“看到”的。我相信它只是在 JPEG 中写入相应的 Exif 标签。但是openCV应该能够读取Exif,然后在将其复制到我相信的Mat中时会更改坐标。
      • 当我使用onPreviewFrame() 时,它会将原始 YUV 数据放入一个字节数组中。没有进行到 JPEG 的转换,而且我实际上并没有“拍照”。所以这个解决方案似乎对我不起作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      • 2012-07-04
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      相关资源
      最近更新 更多