いいえ、これを行うための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オーバーライドし、その後、ときに、プレビューフレームを回転させるために、そこから算出された姿勢値を使用する必要があります
これはこれまで見たことがありますが、「これはJPEG Camera.PictureCallbackから返された画像に影響します。」このコールバックを使用しなくても生データを回転しますか? –
生データを操作することはできません。なぜなら、これはセンサーが「見える」ものであるからです。私はそれがJPEGに対応するExifタグを書き込むと信じています。しかし、openCVはExifを読み取ることができるはずです。次に、それをMatが信じるマットにコピーするときに座標を変更します。 – sschrass
'onPreviewFrame()'を使うと、生のYUVデータをバイト配列にドロップします。 JPEGへの変換はありません。実際には「写真を撮る」というわけではありません。だから、このソリューションは私のために働くようには思われません。 –