Napisałem aplikację na Androida, która przechwytuje podgląd na żywo z kamery. Ważne jest, aby mieć krótki czas otwarcia migawki, który powinien być co najmniej stały.Jakieś szanse na skrócenie czasu migawki dzięki dostępowi do kamery NDK z Androidem?
Obecnie używam następujący kod, aby osiągnąć niski czas naświetlania:
Parameters params = camera.getParameters();
params.setSceneMode(Parameters.SCENE_MODE_SPORTS);
params.setWhiteBalance(Parameters.WHITE_BALANCE_DAYLIGHT);
params.setFlashMode(Parameters.FLASH_MODE_OFF);
params.setFocusMode(Parameters.FOCUS_MODE_INFINITY);
params.setPreviewFpsRange(9000, 29453);
params.setPreviewFrameRate(29453);
params.setJpegQuality(100);
params.setPreviewFormat(ImageFormat.NV21);
params.setPreviewSize(1280,720);
params.setAntibanding(Parameters.ANTIBANDING_OFF);
params.setExposureCompensation(params.getMinExposureCompensation());
params.set("iso", 1250);
camera.setParameters(params);
setSceneMode() wydaje się nie być obsługiwana w moim firmware komórkowe (getSupportedSceneModes zwraca pustą listę). Ustawienie "ISO" nie ma żadnego efektu (nie obejrzeliśmy obrazu, obliczyliśmy tylko liczbę klatek na sekundę). Po prostu znalazłem ten kod gdzieś i użyłem go ... może to po prostu zły ciąg?
Co dzieje się tak daleko jest: Zmiany stóp ramki od 9 do 29,453 fps, który jest jedyną obsługiwaną zakres klatek na sekundę. Więc params.setPreviewFpsRange(29453, 29453);
też nie działa. Szybkość klatek jest wysoka (20-30 fps) w dobrych warunkach oświetleniowych (normalny dzień, w pomieszczeniu, skierowana do okna) i staje się bardzo niska (8-10 fps) dla średniego/słabego światła (światło dzienne, wewnątrz budynku, bezpośrednio z okna) warunki.
Bardziej szczegółowo: Nie muszę wysoką szybkość klatek, ale krótki czas migawki. Zebrane dane będą wykorzystywane do nawigacji w pomieszczeniach (lub: Lokalizacja wewnętrzna w pierwszym kroku). Aplikacja wymaga robienia zdjęć, podczas gdy normalna osoba zwykle chodzi bez osoby, która dba o to, w jaki sposób nosi telefon. Osoba może nawet biegać lub "kołysać się" telefonem (tak jak normalnie poruszasz rękami podczas chodzenia). Zwykle występuje dużo "rozmycia w ruchu", gdy tylko czas otwarcia migawki jest zbyt długi. Sytuacja znacznie różni się od sytuacji "chcę zrobić zdjęcie", w której fotografia stara się utrzymać aparat nieruchomo. W rzeczywistości nie chcemy osiągnąć "dobrych zdjęć", ale chcemy od czasu do czasu wykryć niektóre krawędzie ścian. Spodziewam się dużo "szumu" na zdjęciu, ale mam nadzieję, że tak czy owak działa ...
Pomysł polega na tym, że istnieje szansa uzyskania większej kontroli nad parametrami kamery za pomocą NDK. Czy ktoś ma doświadczenia z NDK i może mi odpowiedzieć, że warto spróbować?
Dodatkowe informacje: używam HTC Desire Z (również o nazwie: "T-Mobile G2" lub "HTC Vision") jako urządzenia testowego.
Chciałbym uniknąć niepotrzebnej kompresji obrazu. Dlatego też podgląd ramek YUV jest w porządku. Nawet zdjęcie w skali szarości (Y-Layer) jest w porządku. Zrootowałem urządzenia testowe. Jako projekt badawczy jest to częściowo w porządku ... ale gdybym mógł uniknąć potrzeby dostępu do roota, wziąłbym to ;-). - Co masz na myśli, mówiąc o "zmodyfikowanej wersji" (niestandardowy ROM?) ... mieć kolegów z S2 ... może warto spróbować. – SDwarfs
Tak, link wskazuje na niestandardową ROM dla S2 dostrojoną pod kątem najwyższej wydajności. W każdym razie, dla projektu badawczego, szukałbym urządzenia z najbardziej wszechstronnym/otwartym aparatem, którego HTC Desire Z nie jest. –
OTOH, gdybym był tobą, nie odrzuciłbym ** linii przechwytywania **. Może to przyniesie lepsze rezultaty dla ciebie. Może kiedy nazwiesz 'takePicture()' "migawką" * (umieszczam to w cudzysłowie, ponieważ nie jest to prawdziwa migawka, ale efekt różnych czynników kamery ISP na rozmycie ruchu) * będzie krótszy? Nie można uzyskać przechwyconych obrazów z prędkością 30 klatek na sekundę, ale w miarę wyjaśniania algorytmu dobrze jest uzyskać stosunkowo ostre obrazy raz na sekundę. –