5

Androidアプリを作成しようとしています。カメラのプレビューを常にポートレート モードで表示し、そのフレーム (の一部) に対して重い画像処理操作を実行します。したがって、私は OpenCV を使用しています (OpenCV4Android とネイティブ C/C++ コンポーネントの両方)。問題は、CameraBridgeViewBase または JavaCameraView クラスを使用する場合、OnCameraFrame によって返されるフレームがランドスケープ モードであることです。

ここで、Activity が横向きモードを使用するように定義されている場合 (OpenCV のサンプル アプリと同様)、プレビューは問題なく見えますが、追加の UI ビューは 90 度傾いています (前述のように、デバイスはアプリを縦向きモードで実行する必要があります)。

アクティビティが縦向きモードに設定されている場合、UI ビューは明らかに正しく見えますが、カメラのプレビューは 90 度傾いています。

OnCameraFrame の画像マトリックスを次のように操作して各フレームを回転させようとすると、次のようになります。

public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
  mRgba = inputFrame.rgba();
  Core.transpose(mRgba,mRgbaT);
  Core.flip(mRgbaT, mRgbaT, -1);
  Imgproc.resize(mRgbaT, mRgbaT, mRgba.size());

  return mRgbaT;
}

次に、各カメラのフレームがデバイスの幅を埋めますが、高さは埋めません (その結果、引き伸ばされて見えます)。加えて、フレーム レートがかなり遅くなります。画像をフルスクリーン (または元のフレーム サイズとは異なるサイズ) にサイズ変更しようとすると、画像がまったく表示されず (黒い画面)、次の例外がスローされます。

E/CameraBridge(11183): Utils.matToBitmap() throws an exception: /home/reports/ci/slave_desktop/50-SDK/opencv/modules/java/generator/src/cpp/utils.cpp:97: error: (-215) src.dims == 2 && info.height == (uint32_t)src.rows && info.width == (uint32_t)src.cols in function void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong, jobject, jboolean)

だから、私の質問は: OpenCV のカメラ プレビューをポートレート モードと全画面表示の両方で表示するにはどうすればよいですか?

残念ながら、私の初心者 SO の評判のため、スクリーンショットを添付できません。また、以前にSOで似たような質問があったことは承知していますが、どの回答も問題を完全に解決しているようには見えません。

4

1 に答える 1

5

私は解決策を見つけました:JavaCameraViewがそれから拡張するのと同様の方法でCameraBridgeViewBaseから拡張するカスタムカメラクラスを作成します(ほとんどの部分は同じです)が、内部のJavaCameraFrameクラスを実装するときは、Matオブジェクトを返すメソッドを置き換えますこのようなもの:

    public Mat rgba() {
        Imgproc.cvtColor(mYuvFrameData, mRgba, Imgproc.COLOR_YUV2BGR_NV12, 4);
        if (mRotated != null)
            mRotated.release();
        mRotated = mRgba.t();
        Core.flip(mRotated, mRotated, -1);
        return mRotated;
    }

ここ素晴らしい例があります(最初の回答、Zarokkaの厚意による)。パフォーマンスが多少低下しますが、OnCameraFrame で出力マットを回転するときほど深刻ではありません (いずれにせよ、問題は完全には解決されません)。私は 640*480 解像度のプレビュー フレーム サイズ (フル スクリーン) で使用しましたが、それほど新しいデバイスでなくても、見栄えがよく、スムーズに動作します。

于 2015-02-19T08:30:20.610 に答える