0

私は実際にAndroidでプロジェクトを行っていますが、バックカメラからの輝度をリアルタイムで計算または推定することに直面しています(つまり、バックカメラからフレームを取得し、フレームごとに輝度の値を取得します)変化する)!残念ながら、カメラのパラメーターにリアルタイムでアクセスできないため、カメラが光に面しているときにパラメーター (ISO、シャッター時間、または絞り) で誰が動作しているかを実際に知ることはできません!)

基本的に、カメラはカメラに入る光の強さによってパラメーターを変化させますので、例えばグレースケール画像の平均値を計算すると、偽の値が出る場合があります!! (例:点光源を正面に向けるとカメラの自動補正で周囲が暗くなる)

そこで、カメラが捉えたフレームの輝度値をフレームのピクセル値から検出する方法がないか自問自答しました: フィルター、計算方法、アルゴリズム、またはそのようなもので、カメラのパラメータを知らなくても、ピクセル値をルミネーション値にマッピングします!!

つまり、カメラがそのパラメーター (現在の Android API では到達できない) をピクセルの値から変更することによって自動補正を行っている場合でも、光を検出する (定量的な値を持っている) (私の意見では、輝度に関する情報を得るために操作できる情報のみ!)。

これは、私のプロジェクトを実現するのに本当に役立ちます! 何か不明な点がありましたら、お知らせください ;)

ありがとうございました :)

4

1 に答える 1

1

これはかなり簡単です。サーフェス ビューとカメラ プレビューを使用する必要があります。そうすれば、各フレームをバイト配列として取得できます。フレームのデフォルトのフォーマットは YUV (Y (輝度)) と UV (クロミナンス) です。Y を使用して、イメージの平均輝度を計算できます。BGR を使用している場合、Y = 0.2126 R + 0.7152 G + 0.0722 B を使用して輝度を計算できます。

class Preview extends ViewGroup implements SurfaceHolder.Callback {

SurfaceView mSurfaceView;
SurfaceHolder mHolder;

Preview(Context context) {
    super(context);

    mSurfaceView = new SurfaceView(context);
    addView(mSurfaceView);

    // Install a SurfaceHolder.Callback so we get notified when the
    // underlying surface is created and destroyed.
    mHolder = mSurfaceView.getHolder();
    mHolder.addCallback(this);
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

... }

クラスにコールバックを追加すると、フレームごとにこのメソッドが呼び出されます。

onPreviewFrame(byte [] frame, Camera cam){
   //do some processing
}

OpenCV には、これらの計算を行うための優れた関数がいくつかあります。

于 2012-12-18T23:04:13.943 に答える