Вопрос по avcapturedevice, objective-c, ios4, avcapturesession – Как сделать фотографию автоматически при фокусировке в iPhone SDK?

4

Я создаю приложение, в котором пользователь делает снимок изображения с текстом и загружает его на сервер. я использовалAVCaptureSession Чтобы открыть камеру и поместил полосу кнопку, которая захватывает последний кадр и загружает его на сервер. В этом приложении пользователь может отправлять несколько изображений на сервер одно за другим, нажимая кнопку панели.

Мне было интересно, если это возможно, что пользователь не должен нажимать кнопку, чтобы захватить кадр. Возможно ли, что текущий кадр захватывается автоматически с автофокусом? Как пользователь просто помещает камеру на секунду на изображение, и когда изображение хорошо сфокусировано, оно автоматически захватывается, чтобы пользователь мог перейти к следующему изображению без необходимости нажимать какую-либо кнопку?

Мой код для захвата кадра выглядит следующим образом:

- (void)initCapture {

    AVCaptureDeviceInput *captureInput = [AVCaptureDeviceInput 
                                          deviceInputWithDevice:[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo] 
                                          error:nil];

    AVCaptureVideoDataOutput *captureOutput = [[AVCaptureVideoDataOutput alloc] init];

    captureOutput.alwaysDiscardsLateVideoFrames = YES; 







    /*We create a serial queue to handle the processing of our frames*/
    dispatch_queue_t queue;
    queue = dispatch_queue_create("cameraQueue", NULL);
    [captureOutput setSampleBufferDelegate:self queue:queue];
    dispatch_release(queue);
    // Set the video output to store frame in BGRA (It is supposed to be faster)
    NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey; 
    NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA]; 
    NSDictionary* videoSettings = [NSDictionary dictionaryWithObject:value forKey:key]; 
    [captureOutput setVideoSettings:videoSettings]; 
    /*And we create a capture session*/
    captureSession = [[AVCaptureSession alloc] init];
    /*We add input and output*/
    [captureSession addInput:captureInput];
    [captureSession addOutput:captureOutput];





    AVCaptureConnection *conn = [captureOutput connectionWithMediaType:AVMediaTypeVideo];

    if (conn.supportsVideoMinFrameDuration)
        conn.videoMinFrameDuration = CMTimeMake(5,1);
    if (conn.supportsVideoMaxFrameDuration)
        conn.videoMaxFrameDuration = CMTimeMake(5,1);





    [captureSession setSessionPreset:AVCaptureSessionPresetPhoto];

    customLayer = [CALayer layer];
    customLayer.frame = self.view.bounds;
    customLayer.transform = CATransform3DRotate(CATransform3DIdentity, M_PI/2.0f, 0, 0, 1);
    customLayer.contentsGravity = kCAGravityResizeAspectFill;
    //[self.view.layer addSublayer:customLayer];
    /*We add the imageView*/



    imageView = [[UIImageView alloc] init];
    imageView.frame = CGRectMake(0, 0, 100, 100);
    //imageView.frame = self.view.bounds;
    [self.view addSubview:imageView];



    [captureSession startRunning];

}

Буду благодарен за вашу помощь. Благодарю.

Вы получили это работает? Мне нужно автоматически захватить изображение, как только критерии будут выполнены в интересующей области. Поэтому, если я правильно понимаю, мне нужно добавить AVCaptureVideoDataOutput для получения информации о камере и использовать наблюдатель AdjustingFocus для захвата StillImage. Есть ли у вас какие-либо идеи, как я мог бы определить область интересов (подраздел часть представления) и игнорировать остальную часть представления? Patricia

Ваш Ответ

1   ответ
2

adjustingFocus Наблюдатель к вашему видео входу:

[[[captureManager videoInput] device] addObserver:self forKeyPath:@"adjustingFocus" options:NSKeyValueObservingOptionNew context:nil];

а затем добавитьobserveValueForKeyPath метод, который делает фотографию, когда настройка фокуса закончена:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if( [keyPath isEqualToString:@"adjustingFocus"] ){
    BOOL adjustingFocus = [ [change objectForKey:NSKeyValueChangeNewKey] isEqualToNumber:[NSNumber numberWithInt:1] ];

    if (!adjustingFocus) {
             [[self captureManager] captureStillImage:self];
        }
    }
}
Где объявлен captureManager?

Похожие вопросы