0

Android のプレビューの現在のフレームで ImageProcessing を実行しようとしています。他のすべてのスマートフォンの場合、かなりうまく機能します。しかし今、Nexus 5x でアプリにアクセスできるようにする必要があります。

そこで、プレビューから 180 度回転した画像を取得します。どうすれば修正できますか?カメラとプレビューを設定するためのコードは次のとおりです。

private void resetCamera(int width, int height){
    Log.d(TAG, "Reset Camera!");
    CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
    try {
        for (String cameraId : cameraManager.getCameraIdList()) {
            CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId);
            mSensorOrientation = cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
            if (cameraCharacteristics.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_FRONT) {
                continue;
            }
            StreamConfigurationMap map = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);

            mImageReader = ImageReader.newInstance(width,
                    height,
                    ImageFormat.YUV_420_888,
                    10);
            mImageReader.setOnImageAvailableListener(mOnImageAvailableTrack,
                    mBackgroundHandler);

            mPreviewSize = getPreferredPreviewSize(map.getOutputSizes(SurfaceTexture.class), width, height);
            mCameraId = cameraId;
            return;
        }
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}

プレビュー:

private void createTrackingPreviewSession(){
    try{
        SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture();
        surfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
        Surface previewSurface = new Surface(surfaceTexture);
        mPreviewCaptureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        mPreviewCaptureBuilder.addTarget(previewSurface);
        mPreviewCaptureBuilder.addTarget(mImageReader.getSurface());

        int rotation = getWindowManager().getDefaultDisplay().getRotation();
        mPreviewCaptureBuilder.set(CaptureRequest.JPEG_ORIENTATION,
                getOrientation(rotation));

        mCameraDevice.createCaptureSession(Arrays.asList(previewSurface, mImageReader.getSurface()),
                new CameraCaptureSession.StateCallback(){
                    @Override
                    public void onConfigured(CameraCaptureSession session) {
                        if(mCameraDevice == null){
                            return;
                        }
                        try{
                        Toast.makeText(getApplicationContext(), "Create Tracking Session", Toast.LENGTH_SHORT).show();
                            mPreviewCapture = mPreviewCaptureBuilder.build();
                            mCaptureSession = session;
                            mCaptureSession.setRepeatingRequest(
                                    mPreviewCapture,
                                    mSessionCaptureCallback,
                                    mBackgroundHandler
                            );
                        } catch(CameraAccessException e){
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void onConfigureFailed(CameraCaptureSession session) {
                        Toast.makeText(
                                getApplicationContext(),
                                "create Camera session failed!",
                                Toast.LENGTH_SHORT
                        ).show();
                    }
                }, null);
    } catch(CameraAccessException e){
        e.printStackTrace();
    }
}

ご覧のとおり、画像をキャプチャするために修正を使用しようとしましたが、プレビューから回転した画像を取得するのに役立ちませんでした。

可能であれば、カメラの設定を変更しようとする解決策が欲しいです。バインドされた ImageReader を介して画像を取得した後、自分で画像を回転させたくありません。

4

1 に答える 1

0

あなたの質問を適切に理解した後、まだ行っていない場合は、次のことを試みます。あなたの問題は、previewCaptureSession ではなく、写真を撮るためのコードにあると思います。

CameraDevice.TEMPLATE_STILL_CAPTURE テンプレートで別の CaptureRequest.Builder を適切に使用していると思います。

この Builder では、JPEG の向きを設定する必要があります。コメントで既に述べたように、一部のカメラ デバイスは 90° 回転し、他のカメラ デバイスは 270° 回転します。

適切な向きを設定するには、次の 2 つのスニペットを実装します。

private static SparseIntArray ORIENTATIONS = new SparseIntArray();
static{
    ORIENTATIONS.append(Surface.ROTATION_0, 0);
    ORIENTATIONS.append(Surface.ROTATION_90, 90);
    ORIENTATIONS.append(Surface.ROTATION_180, 180);
    ORIENTATIONS.append(Surface.ROTATION_270, 270);
}

private int sensorToDeviceRotation(CameraCharacteristics cameraCharacteristics, int deviceOrientation){
    int sensorOrientation = cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
    deviceOrientation = ORIENTATIONS.get(deviceOrientation);
    return (sensorOrientation + deviceOrientation + 360) % 360;
}

または、独自のロジック/実装を使用してください。

画像のキャプチャに使用する captureRequestBuilder では、JPEG_ORIENTATION を次のように設定します。

int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, sensorToDevice(cameraCharacteristics, rotation));

これは、アプリで画像をキャプチャする方法であり、保存された画像は適切に回転されます! これがあなたのやり方なら、プレビューセッションだけでなく、実際に写真を撮るためのコードを追加することをお勧めします。

それが役立つことを願っています!

于 2016-12-03T19:54:05.977 に答える