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 更新。
我正在使用两个单独的 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 更新。