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

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

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

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

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

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

 Tom19 янв. 2011 г., 18:38
Спасибо user432209, это определенно поможет. Я надеюсь, что этот датчик (как он называется?) Общедоступен, может быть, кто-то может просветить нас по этому вопросу.
 user43220919 янв. 2011 г., 18:31
Большинство (всех?) Телефонов Android имеют два крошечных аппаратных датчика, которые используются для «обнаружения дневного света». Обратная связь от этих датчиков заключается в том, как ваш телефон управляет яркостью дисплея, когда вы устанавливаете настройку на автоматическое управление. Интересно, не могли бы вы воспользоваться этими данными? Это было бы во много раз надежнее.

Ответы на вопрос(5)

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

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

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

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

но мне здесь нравится форматирование.

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

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

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

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

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

 Tom19 янв. 2011 г., 21:37
Я не понимаю, почему кто-то отверг тебя. Ваш ответ и обновление полезны. Пожалуйста, голосуйте, люди.
 KevinDTimm19 янв. 2011 г., 18:39
Я должен верить, что алгоритм уже существует, но идея заинтриговала меня, поэтому я сделал быстрый набросок большого пальца о том, как это можно сделать.
 KevinDTimm19 янв. 2011 г., 19:14
Хорошо, понизить голос - но объясните причину (особенно после того, как я отредактировал свой ответ, указав, как получить доступ к аппаратному датчику)
 KevinDTimm19 янв. 2011 г., 18:42
посмотрите мое редактирование - датчик, кажется, доступен.
 Tom19 янв. 2011 г., 18:37
Спасибо, это помогает, возможно, кто-то еще сможет расширить 1) встроенный датчик обнаружения дневного света (это будет лучше, чем камера) 2) ваш алгоритм. Если не удается подключить встроенный датчик яркости, я, вероятно, должен использовать ваш подход.
Решение Вопроса

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

 Confuse23 сент. 2014 г., 12:37
Я получаю ошибку наlightSensor.registerListener(listener); - Метод registerListener (SensorEventListener) не определен для типа Sensor
 kcoppock23 сент. 2014 г., 18:43
@AntiMatter Я обновил ответ с изменениями в соответствии с вашими предложениями. :)
 Tom19 янв. 2011 г., 21:42
Отлично, этот датчик мне очень поможет. Я не уверен, что на многих устройствах (особенно на менее дорогих медиа-плеерах archos) этот датчик реализован, но пока это подойдет. Благодарю.
 Tom19 янв. 2011 г., 22:33
Я понимаю, kcoppock, я думал об альтернативе для поддержки устройств, которые испытывают недостаток этого, хотя. Тем не менее, это то, что я должен задать себе в будущем, так как я не уверен, есть ли необходимость в этом. Еще раз спасибо.
 kcoppock19 янв. 2011 г., 21:47
Вы могли бы использовать<uses-feature android:name="android.hardware.sensor.light" /> в манифесте, и устройства, у которых нет этого датчика, не найдут его на рынке. Кроме того, похоже, что вы могли бы позвонитьgetSensorList(Sensor.TYPE_LIGHT); и затем проверьте, больше ли размер списка, чем 0, чтобы увидеть, имеет ли устройство программный требуемый датчик.

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

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

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

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

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

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

 Sam10 дек. 2014 г., 11:15
Что касается пункта 3, по моему опыту, сделать окно предварительного просмотра камеры невидимым не будет работать, если вы не используетеTextureView и установить егоWindowManager.LayoutParams.alpha в0.
 Sam10 дек. 2014 г., 11:16
Конечно, вам нужно API 14 (Android 4.0, я думаю), чтобы использоватьTextureView.
 Sam10 дек. 2014 г., 11:16
Что касается пункта 4, если вы используетеTextureView в качестве предварительного просмотра камеры, вы можете просто позвонитьTextureView.getBitmap получить текущий кадр в RGB.

Ваш ответ на вопрос