当前位置: 首页 > 面试题库 >

如何在iOS 11和Swift 4中从相机捕获深度数据?

吴弘壮
2023-03-14
问题内容

我正在尝试使用AVDepthData从iOS
11中的相机获取深度数据,当我使用AVCapturePhotoCaptureDelegate设置photoOutput时设置photoOutput.depthData为nil。

因此,我尝试使用AVCaptureDepthDataOutput设置AVCaptureDepthDataOutputDelegate,但是我不知道如何捕获深度照片?

有没有人从AVDepthData获得图像?

编辑:

这是我尝试的代码:

// delegates: AVCapturePhotoCaptureDelegate & AVCaptureDepthDataOutputDelegate

@IBOutlet var image_view: UIImageView!
@IBOutlet var capture_button: UIButton!

var captureSession: AVCaptureSession?
var sessionOutput: AVCapturePhotoOutput?
var depthOutput: AVCaptureDepthDataOutput?
var previewLayer: AVCaptureVideoPreviewLayer?

@IBAction func capture(_ sender: Any) {

    self.sessionOutput?.capturePhoto(with: AVCapturePhotoSettings(format: [AVVideoCodecKey: AVVideoCodecType.jpeg]), delegate: self)

}

func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {

    self.previewLayer?.removeFromSuperlayer()
    self.image_view.image = UIImage(data: photo.fileDataRepresentation()!)

    let depth_map = photo.depthData?.depthDataMap
    print("depth_map:", depth_map) // is nil

}

func depthDataOutput(_ output: AVCaptureDepthDataOutput, didOutput depthData: AVDepthData, timestamp: CMTime, connection: AVCaptureConnection) {

    print("depth data") // never called

}

override func viewDidLoad() {
    super.viewDidLoad()

    self.captureSession = AVCaptureSession()
    self.captureSession?.sessionPreset = .photo

    self.sessionOutput = AVCapturePhotoOutput()
    self.depthOutput = AVCaptureDepthDataOutput()
    self.depthOutput?.setDelegate(self, callbackQueue: DispatchQueue(label: "depth queue"))

    do {

        let device = AVCaptureDevice.default(for: .video)
        let input = try AVCaptureDeviceInput(device: device!)
        if(self.captureSession?.canAddInput(input))!{
            self.captureSession?.addInput(input)

            if(self.captureSession?.canAddOutput(self.sessionOutput!))!{
                self.captureSession?.addOutput(self.sessionOutput!)


                if(self.captureSession?.canAddOutput(self.depthOutput!))!{
                    self.captureSession?.addOutput(self.depthOutput!)

                    self.previewLayer = AVCaptureVideoPreviewLayer(session: self.captureSession!)
                    self.previewLayer?.frame = self.image_view.bounds
                    self.previewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
                    self.previewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait
                    self.image_view.layer.addSublayer(self.previewLayer!)

                }

            }

        }

    } catch {}

    self.captureSession?.startRunning()

}

我正在尝试两件事,一件事是深度数据为零,另一件事是我试图调用深度委托方法。

有人知道我想念的吗?


问题答案:

首先,您需要使用双摄像头,否则您将不会获得任何深度数据。

let device = AVCaptureDevice.default(.builtInDualCamera, for: .video, position: .back)

并保留对您队列的引用

let dataOutputQueue = DispatchQueue(label: "data queue", qos: .userInitiated, attributes: [], autoreleaseFrequency: .workItem)

您可能还想同步视频和深度数据

var outputSynchronizer: AVCaptureDataOutputSynchronizer?

然后,您可以像这样在viewDidLoad()方法中同步两个输出

if sessionOutput?.isDepthDataDeliverySupported {
    sessionOutput?.isDepthDataDeliveryEnabled = true
    depthDataOutput?.connection(with: .depthData)!.isEnabled = true
    depthDataOutput?.isFilteringEnabled = true
    outputSynchronizer = AVCaptureDataOutputSynchronizer(dataOutputs: [sessionOutput!, depthDataOutput!])
    outputSynchronizer!.setDelegate(self, queue: self.dataOutputQueue)
}

我建议您观看WWDC会话507-他们还提供了完全符合您想要的功能的示例应用程序。

https://developer.apple.com/videos/play/wwdc2017/507/



 类似资料:
  • 我想从摄像机中捕获视频并保存在应用程序目录中(不要将视频保存在设备库中),然后将视频路径插入数据库以加载并显示在我的应用程序中 我在活动中尝试: 但是当转到文件目录时,视频大小为0Kb!!并保存到设备库如何解决这个问题?谢谢

  • 这是我的结构数组。我想在swift4中打印以下所有名称:

  • CameraToMpegTest的示例。bigflake中的java。com或Grafika中的“Show capture camera”使用该摄像机。预览以获取帧数据。实验表明(Nexus 4,Android 4.4.2)的帧速率为10fps。这没有预期的那么高。 如果我们使用相同的设备(Nexus 4、Android 4.4.2)使用摄像头录制视频,帧速率为30fps。 所以我假设使用came

  • 问题内容: 网页上的数据是动态显示的,似乎检查html中的每个更改并提取数据是一项非常艰巨的任务,并且还需要我使用非常不可靠的XPath。因此,我希望能够从数据包中提取数据。 我希望能够从数据包中提取信息以及生成要发送到服务器的“ XHR”数据包。提取信息部分对我来说更重要,因为通过使用casperjs自动触发html元素可以轻松处理信息的发送。 我附上我的意思的屏幕截图。 响应选项卡中的文本是我

  • 在官方w3.org留档中,输入类型="文件"标记没有属性。 讽刺的是,我发现在很多地方都使用了。例如这里或这里或这里和其他许多地方。 没有一个教程带有捕获=用户。为什么? 和之间有什么主要区别吗? 您能否同时提及和的设备兼容性?我到处都找不到。

  • 我正在使用一个控制台应用程序和非常基本的Tesseract来执行数字识别。我从谷歌复制了一个图像,试图找到数字只。