2011-01-19 6 views
8

次はAndroidオペレーティングシステムに適用されます。Android:カメラを使って携帯電話の周囲の明るさ(光量)を検出しますか?

カメラを使用して電話機が設置されている部屋の中の暗い(または明るい)状態を推定しようとしています。

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

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

ありがとうございます。

+0

ほとんどの(すべて?)Androidの携帯電話は、「昼光検出」に使用される2つの小型ハードウェアセンサーを備えています。これらのセンサーからのフィードバックは、設定を自動制御に設定したときに携帯電話がディスプレイの明るさを制御する方法です。私はあなたがそのデータに触れることができるのだろうかと思います。何度も信頼できるでしょう。 – user432209

+0

ありがとうuser432209、それは間違いなく助けになるでしょう。私はこのセンサー(それは何と呼ばれていますか?)が公に利用可能であることを願っています。誰かがこのテーマについて私たちを啓発できるかもしれません。 – Tom

答えて

17

を使用すると、光センサーの上にリスナを登録する方法である:

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); 
} 

EDIT:提案の更新のための@AntiMatterに感謝。

ドキュメント: SensorEventListener SensorManager SensorEvent Sensor

+0

偉大な、このセンサーは私をたくさん助けます。私は確かにいくつかのデバイス(特に安価なarchosメディアプレーヤー)がこのセンサーを実装していることは確信していますが、これは今のところ行います。ありがとう。 – Tom

+0

マニフェストで ''を使うことができ、このセンサーを持たないデバイスは市場で見つけられません。あるいは、 'getSensorList(Sensor.TYPE_LIGHT);'を呼び出して、リストのサイズが0より大きいかどうかを調べて、デバイスが必要なセンサーをプログラム的に持っているかどうかを調べるように見えます。 – kcoppock

+0

私はkcoppockを理解していますが、私はそれを欠いているデバイスをサポートする代替手段について考えていました。しかし、これが必要なのかどうかわからないので、これは私が将来自分自身に尋ねる必要があるものです。再度、感謝します。 – Tom

1

私の回答は回答には不完全すぎるかもしれませんが、ここでは書式が好きです。

また、私の答えは面倒ではありませんので、すぐに読んでください。

もちろん、まず写真を撮る必要があります。次に、「明るさ」を定義する必要があります。私はそのようなアルゴリズムを持っていませんが、私はすでに行われているようなものを推測しています。次のようなものがあります。

どのピクセル値が明るく、どのピクセル値が暗く、どのピクセル値が中間であるか(また、各ピクセル値が可変な明るさを持つことができる)を決定します。そのアルゴリズムを写真に適用して輝度値を取得する必要があります。

はい、これは問題の非常に短い(35,000フィート)ビューですが、どこから始めるべきかについてのご意見があります。カメラは、露光時間と絞り値を調整するので、カメラを用い

[編集]
Hereが開始する場所(センサ用アンドロイドドキュメント)である
[/編集]

+0

ありがとう、これは助けになるかもしれない、他の誰かが1)昼光検知センサー(それはカメラよりもうまくいくだろう)2)あなたのアルゴリズムの提案を拡張することができるかもしれません。 inbuildの明るさセンサーをタップできない場合は、おそらくあなたのアプローチを使用する必要があります。 – Tom

+0

私はアルゴリズムがすでに存在していると思っていますが、そのアイデアは私に興味をそそられました。 – KevinDTimm

+0

私の編集を参照してください - センサーがアクセス可能なようです。 – KevinDTimm

1

は、無意味です記録された画像は、(少なくとも理想的な世界では)実際の利用可能な光とは無関係に、非常に類似した全体的な明るさを有することになる。

Android APIは、(TYPE_LIGHTタイプのセンサーに興味がある)ハードウェアセンサーにアクセスするSensorManagerの機能を提供します。しかし、APIを介してこれらのセンサーにアクセスすることができれば、それらが存在する(または存在しない)かもしれませんが、私は確信していません。ここで

+0

カメラに関する情報をお寄せいただきありがとうございます。光センサーのないデバイスでは、カメラで室内の明るさを推定できないことを意味しているのでしょうか? – Tom

0

明るさを見極めるしたいの大したことはHTCが自分camera.apkでそれをやっている方法を理解することです。 DINCの場合は、在庫Androidカメラアプリが過度露出のために恐ろしいです。

5

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

  1. オフにカメラの自動露出を設定し、0〜
  2. セットキャプチャに露出補正を設定します
  3. プレビューウィンドウをできるだけ小さくする(おそらく、非表示に設定しても、解析するフレームを取得することはできません)
  4. イメージプレビューフレームを取得し、しかしそれらはyuv形式であるので、2.1以前のwoul d翻訳者が必要です。

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

多くのアウトライアの状況をテストする必要があるので、私はそれをしないと言っています。それはあなたが車の中で「明るさ」を調整するためにそれを使用している状況だ場合

コースわからないあなたがケースを使用することは、あり、その後、前方を向いたカメラ等のヘッドライト

とにかく面白い問題ではなくによって影響されるだろうこのような小さな利益のために多くの仕事のように思えます。特に、これらのセンサを持つハードウェアのほとんどはまともなものです。

+0

私の経験では、ポイント3については、 'TextureView'を使用し、' WindowManager.LayoutParams.alpha'を '0'に設定しない限り、カメラプレビューウィンドウを非表示にすることはできません。 – Sam

+0

ポイント4に関しては、 'TextureView'をカメラプレビューとして使用すると、' TextureView.getBitmap'を呼び出して現在のフレームをRGBで取得できます。 – Sam

+0

もちろん、あなたは 'TextureView'を使うためにAPI 14(Android 4.0、私は思う)が必要です。 – Sam

関連する問題