iOS ARKit 打破了常规相机质量

iOS ARKit breaks regular camera quality

我正在使用两个单独的 iOS 库,它们利用了设备的摄像头。

第一个是用于使用相机拍摄常规照片的库。第二个,是一个使用 ARKit 测量世界的库。

不知何故,在使用 ARKit 代码后,常规相机质量(具有完全相同的设置和初始化代码)呈现出低得多的质量(图像中有很多噪点,看起来像 post-processing缺少)预览和捕获的图像。 return 相机需要完全重启才能恢复其原始质量。

我知道这可能含糊不清,但这是每个库的代码(或多或少)。任何想法可能会丢失什么?为什么 ARKit 会永久更改相机的设置?如果我知道在使用 ARKit 后哪个设置得到 lost/changed,我可以很容易地修复它。

iOS 图像捕获的代码示例(删除了错误检查和样板文件):

- (void)initializeCaptureSessionInput
{
    AVCaptureDevice *captureDevice = [self getDevice];
    [self.session beginConfiguration];
    NSError *error = nil;
    AVCaptureDeviceInput *captureDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];
    self.session.sessionPreset = AVCaptureSessionPresetPhoto;
    [self.session addInput:captureDeviceInput];
    self.videoCaptureDeviceInput = captureDeviceInput;
    [self.previewLayer.connection setVideoOrientation:orientation];
    [self.session commitConfiguration];
}


- (void)startSession
{

    AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
    if ([self.session canAddOutput:stillImageOutput]) {
        stillImageOutput.outputSettings = @{AVVideoCodecKey : AVVideoCodecJPEG, AVVideoQualityKey: @(1.0)};
        [self.session addOutput:stillImageOutput];
        [stillImageOutput setHighResolutionStillImageOutputEnabled:YES];
        self.stillImageOutput = stillImageOutput;
    }

    [self.session startRunning];
}


[self initializeCaptureSessionInput];
[self startSession];


AVCaptureConnection *connection = [self.stillImageOutput connectionWithMediaType:AVMediaTypeVideo];
[connection setVideoOrientation:orientation];

[self.stillImageOutput captureStillImageAsynchronouslyFromConnection:connection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error) {
    // photo result here...
}]

ARKit 代码:

private var sceneView = ARSCNView()
... other vars...
... init code ...

let configuration = ARWorldTrackingConfiguration()
            
configuration.planeDetection = [.vertical, .horizontal]

// this should technically use Lidar sensors and greatly
// improve accuracy
if #available(iOS 13.4, *) {
    if(ARWorldTrackingConfiguration.supportsSceneReconstruction(.mesh)){
        configuration.sceneReconstruction = .mesh
    }
} else {
    // Fallback on earlier versions
}

//sceneView.preferredFramesPerSecond = 30
sceneView.automaticallyUpdatesLighting = true
//sceneView.debugOptions = [.showFeaturePoints]
sceneView.showsStatistics = false
sceneView.antialiasingMode = .multisampling4X

// Set the view's delegate and session delegate
sceneView.delegate = self
sceneView.session.delegate = self

// Run the view's session
arReady = false
arStatus = "off"
measuringStatus = "off"
sceneView.session.run(configuration)

图片样本:

高质量:https://zinspectordev2.s3.amazonaws.com/usi/2/16146392129fa3017be37a4b63bbfd0e753a62c462.JPEG

低质量:https://zinspectordev2.s3.amazonaws.com/usi/2/1614639283607613c3083344f39adc3c40c74f0217.JPEG

这是因为 ARKit 的最大 输出分辨率低于相机的分辨率。您可以检查 ARWorldTrackingConfiguration.supportedVideoFormats 以获得 ARConfiguration.VideoFormat 的列表,以查看当前设备的所有可用分辨率。

未找到解决方法。然而,这绝对是一个 apple bug,因为它不会发生在较新的设备中。期待 iphone 7 更新。