2012-06-09 10 views
14

Sto lavorando con AVCaptureSession per acquisire l'immagine. Sta funzionando bene ma non dando una buona risoluzione. L'ho confrontato con l'immagine catturata dalla fotocamera di iPhone e ho scoperto che l'immagine della fotocamera dell'iPhone è molto meglio dell'immagine dello AVCaptureSession.AVCaptureSession non fornisce una buona qualità fotografica e una buona risoluzione

Ho visto 3-4 collegamenti su stackOverflow a riguardo ma non ho trovato alcuna soluzione.

anche ho provato tutti i preset

AVCaptureSessionPresetPhoto, 
AVCaptureSessionPresetHigh, 
AVCaptureSessionPresetMedium, 
AVCaptureSessionPresetLow, 
AVCaptureSessionPreset352x288, 
AVCaptureSessionPreset640x480, 
AVCaptureSessionPreset1280x720, 
AVCaptureSessionPreset1920x1080, 
AVCaptureSessionPresetiFrame960x540, 
AVCaptureSessionPresetiFrame1280x720, 

ma fermo immagine è di qualità inferiore. Per favore fatemi sapere se la mia domanda non è abbastanza chiara o mi sono perso qualcosa.

Qualsiasi aiuto sarà apprezzato.

+0

Ti consiglierei di dare un'occhiata a questa app di esempio da apple http://developer.apple.com/library/ios/#samplecode/AVCam/Listings/Classes_AVCamViewController_m.html#//apple_ref/doc/uid/DTS40010112 -Classes_AVCamViewController_m-DontLinkElementID_10 –

+0

@AnkitSrivastava - Ho catturato un'immagine utilizzando questo codice di esempio ma l'immagine statica non è buona. – TheTiger

+0

Quale valore stai impostando per sessionPreset ..? –

risposta

13

Quando si utilizza l'AVCaptureSessionPresetPhoto preset con un AVCaptureStillImageOutput, sono in grado di catturare le immagini su un iPhone 4S con una risoluzione di 3268x2448, che è la stessa identica risoluzione che il built-in dei rendimenti di applicazione della fotocamera. Lo stesso vale per iPhone 4, Retina iPad, ecc., Quindi se si utilizza quella preimpostazione con un input di immagine statica, si otterrà un buffer di esempio da -captureStillImageAsynchronouslyFromConnection:completionHandler: che è la risoluzione nativa della fotocamera.

Per quanto riguarda la qualità delle foto, tenere presente che l'applicazione fotocamera incorporata è in grado di acquisire foto ad alta gamma dinamica (HDR) mediante l'acquisizione rapida di immagini a diversi livelli di esposizione. Non abbiamo accesso a questo tramite le API standard di AV Foundation, quindi tutto ciò che otteniamo è un'immagine a un livello di esposizione definito.

Se si disattiva l'HDR, la qualità dell'immagine è identica a me. Ecco un ingrandimento di un'area di una foto catturata utilizzando un AVCaptureStillImageOutput:

AVCaptureStillImageOutput image

e qui è uno dalla applicazione incorporata photo:

Built-in Photos image

Ignorando le lievi differenze di l'illuminazione a causa di un piccolo spostamento nella direzione della telecamera, la risoluzione e la fedeltà delle immagini acquisite in entrambi i modi sembrano essere le stesse.

Ho catturato la prima immagine utilizzando l'applicazione di esempio SimplePhotoFilter da my open source GPUImage framework, sostituendo il GPUImageSketchFilter predefinito con un GPUImageGammaFilter che non ha regolato alcun gamma, ha semplicemente funzionato come passthrough.

+0

Grazie per la tua risposta !! Ho scaricato il tuo framework GPUImage un mese fa e l'ho anche utilizzato nella mia applicazione di test e l'ho trovato eccezionale. la mia app attuale supporta tutto l'orientamento e il pulsante di accensione off, GPUImage frame è un grande progetto stesso e voglio solo usarne una parte ... e non riesco a farlo e la mia vista della fotocamera è di 359x280 in landscape quindi GPUImage è difficile da usare per me. :-( – TheTiger

+0

è possibile impostare qualsiasi altro preset diverso da quello sopra ..? – TheTiger

+1

@VakulSaini - Basta guardare nelle classi GPUImageStillCamera e GPUImageVideoCamera, dove puoi vedere come ho impostato gli input di AV Foundation e catturare le foto. funziona, quindi basare la tua implementazione su questo. Non sono sicuro del motivo per cui ti stai chiedendo di altri preset, perché se stai scattando una foto vorrai usare AVCaptureSessionPresetPhoto per l'acquisizione con la massima risoluzione. risoluzione rispetto alla camera nativa –

6

Abbiamo avuto lo stesso problema utilizzando quel riferimento di codice. Le foto sono state particolarmente negative utilizzando la fotocamera frontale dell'iPad.

L'abbiamo risolto aggiungendo un ritardo di 1 secondo tra l'impostazione del gestore di cattura e la chiamata del metodo di acquisizione dell'immagine. Ha fatto una differenza abbastanza grande per noi che siamo rimasti soddisfatti del risultato. Sembra che la fotocamera abbia avuto bisogno di tempo per aprire l'otturatore ed eseguire le opzioni predefinite di messa a fuoco automatica/bilanciamento del bianco.

[NSTimer scheduledTimerWithTimeInterval:1.0 
    target:self.captureManager 
    selector:@selector(captureStillImage) 
    userInfo:nil repeats:NO]; 
+0

sì ho provato anche questo, ma penso che non dovrei preoccuparmi di esso perché l'acquisizione dell'immagine da parte di apple codice di esempio AVCam ha anche una cattiva qualità .... solo la cam originale di iPhone cattura le buone foto ... :-) – TheTiger

4

Basta aggiungere questa riga di codice nel file

self.captureSession.sessionPreset = AVCaptureSessionPresetPhoto 

Si otterrà una risoluzione impressionante come l'applicazione fotocamera integrata da Apple.

Problemi correlati