当前位置: 首页 > 知识库问答 >
问题:

如何在iPhone SDK中自动对焦拍照?

秦时铭
2023-03-14

我正在创建一个应用程序,用户在其中使用文本拍摄图像并上传到服务器。我使用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];

}

我将非常感谢你的帮助。谢谢

共有1个答案

盖绪
2023-03-14

您必须在视频输入中添加调整焦距的观察者:

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

然后添加调整焦点完成时拍摄照片的观察值ForKeyPath方法:

- (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];
        }
    }
}
 类似资料:
  • Android最近几个月发布了一款新的应用编程接口相机。我正在努力理解如何让相机自动对焦。 https://groups.google.com/a/android.com/forum/#!searchin/camerax developers/auto$20focus | sort:date/camerax developers/IQ3KZd8iOIY/LIbrRIqEBgAJ 这里是关于这个话题

  • 我有一个带有

  • 问题内容: 我在代码中有以下位置: 我也希望能够像这样使用它: 甚至更好,模仿ng样式的完成方式: 当前版本的AngularJS中是否存在?我在代码中注意到有一个BOOLEAN_ATTR,它获取了AngularJS支持的所有attr。我不想修改它,以免更改版本并忘记更新。 问题答案: 更新 :AngularJS现在有一个指令,该指令可以 对 焦点 上 的表达式进行求值,但是为了完整起见,我在这里提

  • 问题内容: 在Mobile Safari中,设置延迟时间后,我无法专注于文本字段。我附上了一些展示此问题的示例代码。如果在单击按钮时触发.focus(),则一切正常。如果您将焦点放在回调(如setTimeout函数)上,则仅在移动浏览器中失败。在所有其他浏览器中,存在延迟,然后出现焦点。 令人困惑的是,即使在移动浏览器中,也会触发“ focusin”事件。这个(和SO中类似的注释)使我认为这是一个

  • 问题内容: 我有一个具有多个相关属性的类,例如: 如果我正常地制作一个对象,那没有问题, 我将得到2个列表,和。 现在,如果我想先创建一个空对象,并为其分配一个属性,则希望其他属性自动更新,例如 我想自动更新,也想自动更新(分配和自动更新)。这可能吗? Class 是否是正确的选择? 谢谢大家,但是所有其他答案让我完全不知所措。谁能提供一个完整的解决方案,让我可以学习编写自己的解决方案? 我想实现

  • 如何获取容器快照并将快照加载到另一个docker主机中。我想知道容器快照,而不是图像。我对docker中的导出/导入和保存/加载命令感到困惑。我喜欢更清晰或更深入地理解它们。 快照包含运行容器和屋顶的元数据。另一个docker主机中的确切状态。这方面的帮助将是巨大的。