2011-01-19 13 views
8

Poniższe informacje dotyczą systemu operacyjnego Android.Android: wykrywa jasność (ilość światła) w otoczeniu telefonu za pomocą aparatu?

Próbuję oszacować, jak ciemna (lub lekka) jest w pokoju, w którym znajduje się telefon za pomocą aparatu.

Chodzi o to, że kamera może przywrócić określony poziom jasności, który można wykorzystać do określenia ilości światła w otoczeniu telefonu.

Moje pytanie jest proste: jak korzystać z kamery (przedniej tylnej kamery), aby uzyskać taką jasność ("ilość światła")?

Z góry dziękuję.

+0

Większość (wszystkich?) telefonów z Androidem ma dwa małe czujniki, które są używane do "wykrywania światła dziennego". Informacja zwrotna z tych czujników określa sposób, w jaki telefon steruje jasnością wyświetlacza po ustawieniu automatycznego sterowania. Zastanawiam się, czy mógłbyś wykorzystać te dane. Byłoby to wiele razy bardziej niezawodne. – user432209

+0

Dzięki user432209, które z pewnością pomogą. Mam nadzieję, że ten czujnik (jak to się nazywa?) Jest publicznie dostępny, może ktoś może oświecić nas na ten temat. – Tom

Odpowiedz

17

Oto jak zarejestrować słuchacza na czujniku światła:

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: Dzięki @AntiMatter o proponowanych zmianach.

Docs: SensorEventListener SensorManager SensorEvent Sensor

+0

Świetnie, ten czujnik bardzo mi pomoże. Nie jestem pewien, jak wiele urządzeń (szczególnie te tańsze odtwarzacze multimedialne Archos) mają ten sensor zaimplementowany, ale na razie to się uda. Dzięki. – Tom

+0

Możesz użyć '' w manifeście, a urządzenia, które nie mają tego czujnika, nie znajdą go na rynku. Alternatywnie wygląda to tak, jakbyś mógł wywołać 'getSensorList (Sensor.TYPE_LIGHT) ;, a następnie sprawdzić, czy rozmiar listy jest większy od 0, czy programowo ma wymagane urządzenie. – kcoppock

+0

Rozumiem, kcoppock, myślałem o alternatywnej do obsługi urządzeń, które jej brakuje. Jednak jest to coś, o co muszę zadać sobie pytanie w przyszłości, ponieważ nie jestem pewien, czy istnieje taka potrzeba. Dzięki jeszcze raz. – Tom

1

Moja odpowiedź może być zbyt niekompletna, aby uzyskać odpowiedź, ale podoba mi się tu formatowanie.

Dodatkowo, moja odpowiedź nie jest żartobliwa, więc nie przestawaj czytać od razu.

Oczywiście najpierw trzeba zrobić zdjęcie. Następnie musisz zdefiniować "jasność". Nie mam do tego algorytmu, ale zgaduję, że coś takiego już zostało zrobione. Może coś takiego:

Określ, które wartości pikseli są jasne, które są ciemne i które są pomiędzy (i każda z nich może mieć zmienną jasność). Będziesz musiał zastosować ten algorytm do swojego zdjęcia, aby uzyskać wartość jasności.

Tak, jest to bardzo krótki (35 000 stóp) widok problemu, ale powinien dać ci kilka pomysłów na temat tego, od czego zacząć.

[Edycja]
Here to miejsce start (android dokumentacji czujników)
[/ Edycja]

+0

Dzięki, to pomogło, może ktoś inny będzie mógł rozwinąć 1) wbudowany czujnik detekcji światła dziennego (lepiej pasowałby do kamery) 2) sugestię algorytmu. Jeśli nie można skorzystać z wbudowanego czujnika jasności, prawdopodobnie muszę zastosować twoje podejście. – Tom

+0

Muszę uwierzyć, że algorytm już istnieje, ale pomysł mnie zaintrygował, więc dałem szybki, szkicowy szkic, jak to zrobić. – KevinDTimm

+0

zobacz moją edycję - czujnik wydaje się być dostępny. – KevinDTimm

1

Używając aparat jest bezcelowe, ponieważ kamera regulować czas ekspozycji i przysłony do otaczające światło, aby zarejestrowane obrazy miały bardzo podobną ogólną jasność niezależnie od faktycznego dostępnego światła (przynajmniej w idealnym świecie).

Android API oferuje funkcjonalność w SensorManager, aby uzyskać dostęp do czujników sprzętowych (jesteś zainteresowany czujnikiem TYPE_LIGHT). Nie jestem jednak pewien, czy można polegać na dostępie do tych czujników za pośrednictwem interfejsu API, chociaż mogą one (lub nie muszą) być obecne.

+0

Dzięki za informację o kamerze, zastanawiam się, czy to rzeczywiście oznacza, że ​​urządzenie bez czujnika światła nie może oszacować jasności pomieszczenia za pomocą kamery (jako metody awaryjnej). – Tom

0

wielka sprawa w chcąc przybić jasność w dół jest dowiedzieć się, jak HTC robi to w ich camera.apk. Ponieważ aplikacja Android Aparaty jest okropna z powodu nadmiernej ekspozycji, szczególnie w przypadku DINC.

5

Jeśli chcesz korzystać z aparatu, na przykład wtedy, gdy inne czujniki nie były dostępne wtedy bym

  1. Ustaw auto ekspozycji aparatu na OFF i ustawić kompensację ekspozycji na 0
  2. Set przechwytywania najniższa jakość/rozmiar (po co więcej)
  3. Ustaw okno podglądu na tak małe, jak to tylko możliwe (może nawet ustawisz je jako niewidoczne i nadal otrzymasz ramkę do analizy, nie wiesz)
  4. Uzyskaj ramkę podglądu obrazu, ale są one w formacie yuv, więc 2.1 i wcześniej woul Potrzebuję tłumacza.

Następnie obliczałem histogram jasności obrazów i pracowałem w prawo (najjaśniejszy) w lewo (dimmest), aż znalazłem pierwszą znaczącą wartość wyższą niż N, która określałaby jasność twojej sceny.

Powiedziawszy to wszystko, nie zrobiłbym tego, ponieważ musiałbyś przetestować wiele nietypowych sytuacji.

Przedmiot nie wiem, czego używasz sprawy jest, jeśli jest to sytuacja, w której używasz go dostosować „jasności” w samochodzie, a następnie kamera przodem do kierunku jazdy zostanie dokonana przez reflektory itp

Zresztą ciekawy problem, ale Wydaje się, że dużo pracy przy tak małym zysku, zwłaszcza w przypadku najbardziej przyzwoitych urządzeń posiadających te czujniki.

+0

Jeśli chodzi o punkt 3, z mojego doświadczenia wynika, że ​​niewidoczne okno podglądu kamery nie działa, chyba że użyjesz 'TextureView' i ustawisz jego' WindowManager.LayoutParams.alpha' na '0'. – Sam

+0

Jeśli chodzi o punkt 4, jeśli użyjesz 'TextureView' jako podglądu kamery, możesz po prostu wywołać' TextureView.getBitmap', aby uzyskać aktualną ramkę w RGB. – Sam

+0

Oczywiście, potrzebujesz API 14 (Android 4.0, myślę), aby użyć 'TextureView'. – Sam

Powiązane problemy