Android: определить яркость (количество света) в окружении телефона с помощью камеры? - PullRequest
10 голосов
/ 19 января 2011

Следующее относится к операционной системе Android.

Я пытаюсь оценить, насколько темно (или светло) в комнате, где находится телефон, с помощью камеры.Идея заключается в том, что камера может вернуть определенный уровень яркости, который я могу использовать для определения количества света в окружении телефона.

Мой вопрос прост: как использовать камеру (либо переднююзадней камеры), чтобы получить это количество яркости («количество света»)?

Заранее спасибо.

Ответы [ 5 ]

23 голосов
/ 19 января 2011

Вот как вы регистрируете слушателя на датчике света:

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 за предложенные обновления.

Docs: SensorEventListener SensorManager SensorEvent Sensor

6 голосов
/ 18 июня 2011

Если вы хотите использовать камеру, например, если другие датчики недоступны, тогда я бы

  1. отключил автоматическую экспозицию камеры и установил компенсацию экспозиции на 0
  2. Установите для захвата самое низкое качество / размер (зачем беспокоиться о большем)
  3. Сделайте окно предварительного просмотра как можно меньше (возможно, вы даже можете установить его как невидимое и при этом получить кадр для анализа, не уверен)
  4. Получите рамку предварительного просмотра изображения, но она в формате yuv, поэтому для версии 2.1 и более ранних потребуется переводчик.

Затем я бы вычислил гистограмму для яркости изображений и работал правильноярче) влево (тусклее), пока вы не найдете первое значимое значение выше N, которое будет определять яркость вашей сцены.

Сказав все это, я бы не стал этого делать, поскольку вам нужно было бы проверять множество посторонних ситуаций.

Конечно, не уверен, что вы используете случай, если вы используете его для регулировки «яркости» в автомобиле, тогда передняя камера будет зависеть от фар и т. Д.

В любом случае интересная проблема, но, похоже, много работы для такого небольшого выигрыша, особенно с наиболее приличным оборудованием, имеющим эти датчики

2 голосов
/ 19 января 2011

Мой ответ может быть слишком неполным для ответа, но мне здесь нравится форматирование.

Кроме того, мой ответ не является остроумным, поэтому не прекращайте читать прямо сейчас.

Конечно, сначала вам нужно будет сделать снимок. Тогда вам придется определить «яркость». У меня нет алгоритма для этого, но я предполагаю, что нечто подобное уже сделано. Может быть что-то вроде:

Определите, какие значения пикселей яркие, какие темные, а какие промежуточные (и каждое из них может иметь различное количество яркости). Затем вам придется применить этот алгоритм к вашей фотографии, чтобы получить значение яркости.

Да, это очень краткое (35 000 футов) представление о проблеме, но оно должно дать вам некоторые идеи о том, с чего начать.

[править]
Здесь - это место для начала (документация для Android по датчикам)
[/ Править]

1 голос
/ 19 января 2011

Использование камеры бессмысленно, поскольку камера будет регулировать время экспозиции и апертуру для окружающего света, так что записанные изображения будут иметь очень похожую общую яркость независимо от фактического доступного света (по крайней мере в идеальном мире).

API Android предлагает функциональность SensorManager для доступа к аппаратным датчикам (вас интересует датчик типа TYPE_LIGHT). Однако я не уверен, что вы можете рассчитывать на доступ к этим датчикам через API, хотя они могут (или не могут) присутствовать.

0 голосов
/ 01 февраля 2011

Большое желание пригладить яркость состоит в том, чтобы выяснить, как HTC это делает в своем camera.apk. Потому что стандартное приложение Android Camera ужасно для передержки, особенно для DINC.

...