10

以下は、Androidオペレーティングシステムに適用されます。

カメラを使って、電話が置かれている部屋の暗さ(または明るさ)を推定しようとしています。

カメラは特定の明るさのレベルを返すことができるという考えです。これを使用して、電話の周囲の光の量を判断できます。

私の質問は簡単です。カメラ(背面カメラの前面)を使用して、この明るさ(「光の量」)を取得するにはどうすればよいですか?

前もって感謝します。

4

5 に答える 5

23

光センサーにリスナーを登録する方法は次のとおりです。

private final SensorManager mSensorManager;
private final Sensor mLightSensor;
private float mLightQuantity;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Obtain references to the SensorManager and the Light Sensor
    mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
    mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);

    // Implement a listener to receive updates
    SensorEventListener listener = new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent event) {
            mLightQuantity = event.values[0];
        }
    }

    // Register the listener with the light sensor -- choosing
    // one of the SensorManager.SENSOR_DELAY_* constants.
    mSensorManager.registerListener(
            listener, lightSensor, SensorManager.SENSOR_DELAY_UI);
}

編集:提案された更新については@AntiMatterに感謝します。

ドキュメント: SensorEventListener SensorManager SensorEvent Sensor

于 2011-01-19T18:15:51.113 に答える
6

たとえば、他のセンサーが利用できない場合など、カメラを使用したい場合は、

  1. カメラの自動露出をオフに設定し、露出補正を0に設定します
  2. キャプチャを最低の品質/サイズに設定します(なぜもっと気にするのか)
  3. プレビューウィンドウをできるだけ小さくします(非表示に設定しても、分析するフレームを取得できる可能性がありますが、確かではありません)
  4. 画像プレビューフレームを取得しますが、それらはyuv形式であるため、2.1以前ではトランスレータが必要になります。

次に、画像の明るさのヒストグラムを計算し、シーンの明るさを決定するNより大きい最初の有意な値が見つかるまで、右(最も明るい)から左(最も暗い)に作業します。

多くの異常値の状況をテストする必要があるため、すべてを言っても、私はそれを行いません。

もちろん、ユースケースが何であるかはわかりません。車の「明るさ」を調整するために使用している場合、前向きカメラはヘッドライトなどの影響を受けます。

とにかく興味深い問題ですが、特にこれらのセンサーを備えたハードウェアのほとんどのまともな部分では、そのような小さな利益のために多くの作業のようです

于 2011-06-18T05:10:11.510 に答える
2

私の回答は答えには不完全すぎるかもしれませんが、ここでのフォーマットは気に入っています。

さらに、私の答えは面白くないので、すぐに読むのをやめないでください。

もちろん、最初に写真を撮る必要があります。次に、「明るさ」を定義する必要があります。そうするためのアルゴリズムはありませんが、そのようなことはすでに行われていると思います。多分次のようなもの:

どのピクセル値が明るいか、どのピクセル値が暗いか、そしてどのピクセル値がその間にあるかを決定します(そしてそれらのそれぞれは可変量の明るさを持つことができます)。次に、そのアルゴリズムを写真に適用して、明るさの値を取得する必要があります。

はい、これは問題の非常に短い(35,000フィート)ビューですが、どこから始めればよいかについてのアイデアが得られるはずです。

[編集]
ここから始めましょう(センサーのAndroidドキュメント)
[/編集]

于 2011-01-19T17:28:19.950 に答える
1

カメラは周囲の光に対する露出時間と絞りを調整するため、カメラを使用しても意味がありません。そのため、記録された画像は、実際に利用可能な光に関係なく、全体的な明るさが非常に似ています(少なくとも理想的な世界では)。

Android APIは、ハードウェアセンサーにアクセスするためのSensorManagerの機能を提供します(タイプTYPE_LIGHTのセンサーに関心があります)。ただし、APIを介したこれらのセンサーへのアクセスに依存できるかどうかはわかりませんが、存在する場合と存在しない場合があります。

于 2011-01-19T17:55:53.127 に答える
0

明るさを抑えたいのは、HTCがcamera.apkでどのように明るさを調整しているかを把握することです。在庫のAndroidカメラアプリは、特にDINCの露出オーバーに対して恐ろしいためです。

于 2011-02-01T18:18:44.093 に答える