Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;点击“聚焦”;至;“自动对焦”;当摄影机视图中的内容发生更改时。像股票摄像头应用程序或iOS的UIImagePickerController中的逻辑?_Ios_Camera_Avfoundation_Key Value Observing_Autofocus - Fatal编程技术网

&引用;点击“聚焦”;至;“自动对焦”;当摄影机视图中的内容发生更改时。像股票摄像头应用程序或iOS的UIImagePickerController中的逻辑?

&引用;点击“聚焦”;至;“自动对焦”;当摄影机视图中的内容发生更改时。像股票摄像头应用程序或iOS的UIImagePickerController中的逻辑?,ios,camera,avfoundation,key-value-observing,autofocus,Ios,Camera,Avfoundation,Key Value Observing,Autofocus,当视图中的内容更改时,在失去焦点后,如何处理从特定POI的“点击到焦点”自动切换回“自动焦点”状态?如果您在stock Camera应用程序或UIImagePickerController中注意到对焦行为,在您点击对焦某个区域并将手机移开后,相机可以在屏幕中央自动切换到连续自动对焦 我需要比UIImagePickerController提供更多的灵活性,所以我需要先使用AVFoundation来模拟UIImagePickerController的行为…这听起来很复杂。。。但它变得超级简单,苹果已

当视图中的内容更改时,在失去焦点后,如何处理从特定POI的“点击到焦点”自动切换回“自动焦点”状态?如果您在stock Camera应用程序或UIImagePickerController中注意到对焦行为,在您点击对焦某个区域并将手机移开后,相机可以在屏幕中央自动切换到连续自动对焦


我需要比UIImagePickerController提供更多的灵活性,所以我需要先使用AVFoundation来模拟UIImagePickerController的行为…

这听起来很复杂。。。但它变得超级简单,苹果已经为我们完成了99%的工作。您只需在“AVCaptureDeviceSubjectAreaDidChangeNotification”上设置“”并注册KVO!在iOS 6.1文档上:

此属性的值指示接收器是否应 监控视频主题区域的变化,如照明变化, 实质性的运动等等。如果主题区域变更监控 启用后,捕获设备对象将发送 AVCaptureDeviceSubjectArea在检测到 更改主题区域,此时感兴趣的客户可以 希望重新对焦、调整曝光、白平衡等

更改此属性的值之前,必须调用 lockForConfiguration:以独占方式访问设备的 配置属性。如果没有,请设置此 属性引发异常。完成配置后 设备,调用unlockForConfiguration以释放锁并允许 用于配置设置的其他设备

可以使用键值观察此属性值的更改 观察

(更好的是,你不需要处理很多角落的情况。如果设备处于POI中的“调整焦点”,内容改变了呢?你不希望设备回落到自动对焦的中心,并希望焦点动作完成。“区域改变通知”只在焦点完成后触发。) 我的项目中的一些示例代码片段。(该结构遵循官方的AVFoundation示例AVCam,因此您可以轻松地将其放入并试用):


我刚刚看到了@Xiaochao Yang的答案的评论,我想添加一些关于代码
CGPointMake(.5f,.5f)
的解释。根据苹果的API,您为相机设置的CGPoint在{0,0}到{1,1}的范围内,同时
CGPointMake(.5f,.5f)
表示相机的中心

此属性表示一个CGPoint,其中{0,0}对应于图片区域的左上角,{1,1}对应于横向模式下的右下角,且主页按钮位于右侧。即使设备处于纵向模式,此属性也适用


为什么在调用continuousFocusAtPoint:CGPointMake(.5f,.5f)之前检查focusMode==AVCaptureFocusModelLocked?我认为默认行为是相反的-如果用户未锁定,则将焦点设置在屏幕中央。@帖木儿注意在“subjectAreaDidChangeBlock”中会发生这种情况,这意味着在焦点锁定后,相机中的内容会发生变化,默认行为是焦点位于屏幕中央。你可以先点击角上的焦点进行检查,然后将你的相机移到另一个物体上,相机将聚焦到中心相机将聚焦到中心-是的,没错。但若用户通过长按手动锁定焦点,则不应更改它。这是默认行为。右键检查这里是device.focusMode!=AVCaptureFocusModelLocked这不是默认行为,即使用户在某处手动锁定焦点,也不是永远。摄影机中的场景更改后,摄影机将知道您的对象已更改,并重新聚焦到中心。你可以用手机验证。这就是这个问题和代码的全部要点。有Swift版本吗?谢谢这是一个很好的观察,许多帖子只实现了“点击聚焦”,但忘记了恢复到“自动聚焦”,谢谢你指出这一点!您确定相机默认聚焦在屏幕中央吗?相机有复杂的自动对焦算法,试图决定什么是有趣的。
// CameraCaptureManager.m

@property (nonatomic, strong) AVCaptureDevice *backFacingCamera;

- (id) init{
    self = [super init];
    if (self){

        // TODO: more of your setup code for AVFoundation capture session
        for (AVCaptureDevice *device in [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]) {
            if (device.position == AVCaptureDevicePositionBack){
                self.backFacingCamera = device;
            }
        }

        NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];

        void (^subjectAreaDidChangeBlock)(NSNotification *) = ^(NSNotification *notification) {

            if (self.videoInput.device.focusMode == AVCaptureFocusModeLocked ){
                // All you need to do is set the continuous focus at the center. This is the same behavior as
                // in the stock Camera app
                [self continuousFocusAtPoint:CGPointMake(.5f, .5f)];
            }
        };

        self.subjectAreaDidChangeObserver = [notificationCenter addObserverForName:AVCaptureDeviceSubjectAreaDidChangeNotification
                                                                            object:nil
                                                                             queue:nil
                                                                        usingBlock:subjectAreaDidChangeBlock];

        [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
        [self addObserver:self forKeyPath:keyPathAdjustingFocus options:NSKeyValueObservingOptionNew context:NULL];
    }

    return self;
}

-(void) dealloc{
    // Remove the observer when done
    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
    [notificationCenter removeObserver:self.deviceOrientationDidChangeObserver];
}

- (BOOL) setupSession{
    BOOL sucess = NO;

    if ([self.backFacingCamera lockForConfiguration:nil]){
        // Turn on subject area change monitoring
        self.backFacingCamera.subjectAreaChangeMonitoringEnabled = YES;
    }

    [self.backFacingCamera unlockForConfiguration];

    // TODO: Setup add input etc...

    return sucess;
}