gpt4 book ai didi

ios - 来自 AVDepthData 的深度图不同于 Photoshop 中的 HEIC 文件深度数据

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:28:30 26 4
gpt4 key购买 nike

我正在使用以下代码提取深度图(按照 Apple 自己的示例):

- (nullable AVDepthData *)depthDataFromImageData:(nonnull NSData *)imageData orientation:(CGImagePropertyOrientation)orientation {
AVDepthData *depthData = nil;

CGImageSourceRef imageSource = CGImageSourceCreateWithData((CFDataRef)imageData, NULL);
if (imageSource) {
NSDictionary *auxDataDictionary = (__bridge NSDictionary *)CGImageSourceCopyAuxiliaryDataInfoAtIndex(imageSource, 0, kCGImageAuxiliaryDataTypeDisparity);
if (auxDataDictionary) {
depthData = [[AVDepthData depthDataFromDictionaryRepresentation:auxDataDictionary error:NULL] depthDataByApplyingExifOrientation:orientation];
}

CFRelease(imageSource);
}

return depthData;
}

我称它为:

[[PHAssetResourceManager defaultManager] requestDataForAssetResource:[PHAssetResource assetResourcesForAsset:asset].firstObject options:nil dataReceivedHandler:^(NSData * _Nonnull data) {
AVDepthData *depthData = [self depthDataFromImageData:data orientation:[self CGImagePropertyOrientationForUIImageOrientation:pickedUiImageOrientation]];
CIImage *image = [CIImage imageWithDepthData:depthData];
UIImage *uiImage = [UIImage imageWithCIImage:image];
UIGraphicsBeginImageContext(uiImage.size);
[uiImage drawInRect:CGRectMake(0, 0, uiImage.size.width, uiImage.size.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData *pngData = UIImagePNGRepresentation(newImage);
UIImage* pngImage = [UIImage imageWithData:pngData]; // rewrap
UIImageWriteToSavedPhotosAlbum(pngImage, nil, nil, nil);
} completionHandler:^(NSError * _Nullable error) {

}];

这是结果:它是低质量的(并且旋转了,但现在让我们把方向放在一边)图像:

enter image description here

然后我传输了原始的 HEIC 文件,在 Photoshop 中打开,转到 channel ,并选择如下深度图:

enter image description here

结果如下:

enter image description here

这是一个分辨率/质量更高、方向正确的深度图。为什么代码(实际上是 Apple 自己的代码,位于 https://developer.apple.com/documentation/avfoundation/avdepthdata/2881221-depthdatafromdictionaryrepresent?language=objc )导致质量较低?

最佳答案

我发现了问题。实际上,它隐藏在众目睽睽之下。从 +[AVDepthData depthDataFromDictionaryRepresentation:error:] 方法中获取的内容返回disparity 数据。我已使用以下代码将其转换为深度:

if(depthData.depthDataType != kCVPixelFormatType_DepthFloat32){
depthData = [depthData depthDataByConvertingToDepthDataType:kCVPixelFormatType_DepthFloat32];
}

(没试过,但 16 位深度,kCVPixelFormatType_DepthFloat16,应该也能正常工作)

将视差转换为深度后,图像与 Photoshop 中的图像完全相同。我应该在使用 CGImageSourceCopyAuxiliaryDataInfoAtIndex(imageSource, 0, kCGImageAuxiliaryDataTypeDisparity); 时醒来(注意最后的“差异”)并且 Photoshop 清楚地说“深度图”,将差异转换为深度(或者只是以某种方式读取深度,老实说我不知道​​物理编码,也许当我首先复制辅助数据时 iOS 正在将深度转换为视差)。

旁注:我还通过直接从 [PHAsset requestContentEditingInputWithOptions:completionHandler:] 方法创建图像源并传递 contentEditingInput 解决了方向问题.fullSizeImageURLCGImageSourceCreateWithURL 方法。它负责方向。

关于ios - 来自 AVDepthData 的深度图不同于 Photoshop 中的 HEIC 文件深度数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53753640/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com