2013-04-25 3 views
6

私のカメラアプリは、生のカメラフレームをOpenCVでonPreviewFrame()から処理し、画面に表示します。しかし、生のフレームは、カメラが携帯電話に取り付けられる方法に向けられていますが、通常は右上には表示されません。これを修正するために、OpenCVを使って手動で回転させています。これは時間がかかります。生のカメラデータを正しく方向付けする

私はsetDisplayOrientationを使用してに見てきたが、ドキュメントが

これはonPreviewFrame

に渡されたバイト配列の順序には影響しないと述べていると私は実際にが可能にデータを必要とします右側を上にして、右側を上に表示するだけではありません。生のカメラデータの向きを正しく設定するにはどうすればよいですか?これが不可能な場合は、例えばOpenGLを使用してonPreviewFrame()に渡されたバイト配列を効率的に回転できますか?

答えて

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

setDisplayOrientationは、私が正しく想起している限り、あなたが描いているカメラと面を回転させるだけです。 私はあなたがカメラの解釈を回転させたいと考えています。setRotation

+1

これはこれまで見たことがありますが、「これはJPEG Camera.PictureCallbackから返された画像に影響します。」このコールバックを使用しなくても生データを回転しますか? –

+0

生データを操作することはできません。なぜなら、これはセンサーが「見える」ものであるからです。私はそれがJPEGに対応するExifタグを書き込むと信じています。しかし、openCVはExifを読み取ることができるはずです。次に、それをMatが信じるマットにコピーするときに座標を変更します。 – sschrass

+0

'onPreviewFrame()'を使うと、生のYUVデータをバイト配列にドロップします。 JPEGへの変換はありません。実際には「写真を撮る」というわけではありません。だから、このソリューションは私のために働くようには思われません。 –