2012-09-18 6 views
6

Ho scritto un'applicazione Android che cattura un'anteprima dal vivo della telecamera. È importante avere un tempo di scatto breve, che dovrebbe essere almeno costante.Qualche possibilità di ridurre il tempo di otturazione con l'accesso alle fotocamere Android NDK?

Attualmente io uso il seguente codice per ottenere un tempo di scatto bassa:

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); 

Il setSceneMode() non sembra essere supportato al mio firmware telefoni (getSupportedSceneModes restituisce una lista vuota). L'impostazione "ISO" non ha probabilmente alcun effetto (non ho guardato l'immagine, ma ho appena calcolato il frame rate). Ho appena trovato questo codice da qualche parte e l'ho usato ... forse è solo la stringa sbagliata?

Quello che succede finora è: Il frame rate cambia tra 9 e 29.453 fps, che è l'unico intervallo di frame rate supportato. Quindi, params.setPreviewFpsRange(29453, 29453); non funziona. La frequenza fotogrammi è alta (20-30 fps) in buone condizioni di luce (giorno normale, interno, diretto alla finestra) e diventa molto bassa (8-10 fps) per luce medio/bassa (luce diurna, interni, diretta dalla finestra) condizioni.

Più in dettaglio: non è necessario un frame rate elevato, ma un tempo di otturazione basso. I dati raccolti devono essere utilizzati per la navigazione interna (o: localizzazione interna in un primo passaggio). L'applicazione deve scattare foto mentre una persona cammina normalmente, senza che la persona si preoccupi di come sta portando il telefono. La persona potrebbe persino correre o "oscillare" il telefono (come normalmente muoveresti le braccia quando camminerai). Di solito c'è un sacco di "motion blur", non appena il tempo di posa è troppo lungo. La situazione è molto diversa dalle situazioni di "Voglio fare una foto", in cui la fotografia tenta di tenere ferma la fotocamera. In realtà non vogliamo ottenere "buone foto", ma vogliamo in qualche modo rilevare alcuni bordi dei muri di volta in volta. Mi aspetto un sacco di "rumore" nella foto, ma si spera che funzionino comunque ...

L'idea è, che ci sono possibilità di ottenere un maggiore controllo sui parametri della telecamera usando l'NDK. Qualcuno ha avuto esperienze con l'NDK e può rispondermi che vale la pena provare?

Ulteriori informazioni: utilizzo un dispositivo HTC Desire Z (denominato anche "T-Mobile G2" o "HTC Vision") come dispositivo di test.

risposta

5

La risposta breve è "NO". La risposta più lunga inizia con una domanda: la tua app non si preoccupa dell'acquisizione, ma usa solo i frame di anteprima YUV, è corretto?

Come app scaricata standard senza accesso alla root, non si dispone delle autorizzazioni per accedere direttamente alla fotocamera (o altro dispositivo). Hai solo l'API setParameters() per attuare il comportamento della videocamera, e quindi sei completamente in balia degli OEM riguardo a quale funzionalità della fotocamera viene esposta attraverso questa API.

Anche su un dispositivo rooted, le capacità sono limitate, ma ora dalle specifiche dei driver di dispositivo e dell'ISP specifico della telecamera.

In entrambi i casi, è necessario iniziare scegliendo con molta attenzione il dispositivo di destinazione. Credo che alcuni telefoni Android consentano un controllo della fotocamera molto maggiore rispetto a HTC Vision. Ad esempio, una versione modificata di Samsung S2 http://pfittech.com/rom_pfittech_jb.html vanta 25 FPS a 1080p stabili.

+0

Vorrei evitare qualsiasi compressione non necessaria dell'immagine. Pertanto i fotogrammi YUV dell'anteprima vanno bene. Anche solo un'immagine in scala di grigio (Y-Layer) è ok. Ho radicato i dispositivi di test. Essendo un progetto di ricerca, questo è parzialmente ok ... ma se potessi evitare la necessità dell'accesso root, lo prenderei ;-). - Cosa intendi per "versione modificata" (ROM personalizzata?) ... avere alcuni colleghi con un S2 ... forse vale la pena provare. – SDwarfs

+0

Sì, il collegamento punta a una ROM personalizzata per S2 ottimizzata per le massime prestazioni. Ad ogni modo, per un progetto di ricerca, avrei cercato un dispositivo con la fotocamera più versatile/aperta, che HTC Desire Z non è. –

+0

OTOH, se fossi in te, non scarterei la rotta ** capture **. Forse produrrà risultati migliori per te. Forse quando chiami 'takePicture()' lo "shutter" * (lo metto tra virgolette perché non è un vero otturatore, ma l'effetto di diversi fattori dell'ISP Camera sul motion blur) * sarà più breve? Non è possibile ottenere immagini catturate a 30 FPS, ma come si spiega il proprio algoritmo, potrebbe essere opportuno ottenere immagini relativamente nitide una volta al secondo. –

Problemi correlati