6

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

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

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

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

4

2 回答 2

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

于 2013-04-26T18:34:27.017 回答
1

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

于 2013-04-25T21:50:20.567 回答