【问题标题】:iOS ARKit breaks regular camera qualityiOS ARKit 打破常规相机质量
【发布时间】:2021-05-31 12:04:57
【问题描述】:

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

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

不知何故,在使用 ARKit 代码后,常规相机质量(具有完全相同的设置和初始化代码)渲染的质量要低得多(图像中有很多噪点,看起来缺少后处理)预览和捕获图片。需要重新启动完整的应用程序才能将相机恢复到其原始质量。

我知道这可能含糊不清,但这里是每个库的代码(或多或少)。有什么想法可能会丢失吗?为什么 ARKit 会永久更改相机的设置?如果我知道使用 ARKit 后哪个设置丢失/更改,我可以轻松修复它。

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

【问题讨论】:

  • 确认是 iphone 7 的错误,因为它不会发生在 12 pro 上。

标签: ios swift camera arkit


【解决方案1】:

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

【讨论】:

  • 我明白这一点,我不需要改变 ARKit 的行为方式。但是,为什么普通相机在处理完 ARKit 中的所有内容后,在一个全新的会话中仍会使用上一个会话的分辨率?此外,我将捕获会话预设设置为AVCaptureSessionPresetPhoto,它应该处理分辨率等。闻起来像苹果虫。
  • 尝试使用AVCaptureSessionPresetHigh 而不是AVCaptureSessionPresetPhoto,可能会有所帮助。
  • 已经尝试过了,结果相同,但更丑陋(PresetHigh 用于视频)。我还调试了打印captureDevice.activeFormat,它似乎使用了可用的最高格式/质量。相机非常嘈杂,好像缺少后期处理一样。有趣的是,视频录制可以正常工作,切换摄像头也可以,但是 ARKit 使用的那个就变得一团糟了。
  • 看起来真的是闪电/处理问题。 AVCaptureSessionPresetPhoto 变得和AVCaptureSessionPresetHigh 一样,但分辨率没有变化。 ARKit 正在更改设备配置中未由任何预设设置的内容。
【解决方案2】:

没有找到解决办法。但是,这绝对是一个苹果错误,因为它不会发生在较新的设备中。期待 iphone 7 的更新。

【讨论】:

    猜你喜欢
    • 2018-03-22
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多