2011-02-02 18 views
7

Moja aplikacja iPhone rejestruje dane w czasie rzeczywistym z kamery za pomocą AVCaptureSession AVFoundation. Mogę uzyskać dostęp do tych danych w ramach metody delegowania w środowisku wykonawczym i utworzyć z niego obraz. Może to być CGImage, UIImage lub po prostu nieprzetworzone dane (CMSampleBufferRef).Określanie luminancji/jasności obrazu

Próbuję obliczyć luminancję, jasność tych danych (obraz). Lub może to być inna wartość, która może wskazać mi, jak jasne jest światło wejściowe.

Czy istnieje jakiś standardowy sposób uzyskania tej wartości? Być może przy użyciu OpenGL.

Z góry dziękuję.

Odpowiedz

13

Po prostu skonwertuj obraz do YUV format i obliczyć średnią kanału luma. Konwersja kolorów jest typową operacją, a każda przyzwoita struktura przetwarzania obrazu ją obsługuje. Na przykład OpenCV (powiedziałeś, że OpenGL, ale to naprawdę nie ma nic wspólnego z przetwarzaniem obrazu, zakładam, że chodziło Ci o OpenCV) ma CvtColor.

Jeśli nie masz takiej ramy poręczny, ale ma dostęp do intensywności pikseli, można użyć równania:

Y' = 0.299*R + 0.587*G + 0.144*B 

dostać kanał Luma, a następnie obliczyć średnią. R, G i B reprezentują odpowiednio czerwony, zielony i niebieski kanał.

EDIT

Należy zauważyć, że możliwe jest, że aparat będzie zrekompensować jasnych/ciemnych scenach, modyfikując jego przysłony. Jest to zależne od kamery, ale myślę, że większość aparatów to robi - w przeciwnym razie twoje zdjęcia mogą być albo nasycone (czysto białe), albo zwykłe czarne - w obu przypadkach bezużyteczne. Ludzkie oczy faktycznie do the same thing.

Wadą jest to, że trudno jest stwierdzić, czy jesteś w ciemnym lub lekkim otoczeniu, patrząc tylko na obraz. W takim przypadku konieczne może być wyjście poza obraz i zapytanie do kamery. Teoretycznie możesz to zrobić bezpośrednio przez sterownik (mało prawdopodobne) lub patrząc na metadane obrazu (np. Z JPEG, jest tam EXIF).

Na koniec nie powiedziałeś, co dokładnie chcesz znać jasność. Jeśli jest to scena ogólna, średnia będzie wystarczająco dobra. Jeśli jest to część sceny, być może trzeba zrobić coś mądrzejszego. Daj nam znać, jeśli tak jest.

+0

Dzięki, myślę, że to musi zadziałać. Spróbuję i opublikuję wynik tutaj. – krafter

+0

Spójrz na mój zredagowany komentarz - zidentyfikowałem potencjalny problem i niektóre sposoby jego rozwiązania. – misha

+0

Tak, to faktycznie działa: uzyskanie informacji o pikselach dzieląc go na intensywność kolorów, a następnie obliczanie Y, jak pokazano tutaj. Ponieważ potrzebuję średniej wartości jasności małych (szybkich) pulsowań światła, zanim kamera będzie mogła się do niej dostosować, ta metoda działa dobrze. Dzięki jeszcze raz. – krafter