将DJI视频提要与Vision Framework结合使用

时间:2018-09-18 18:32:56

标签: ios swift dji-sdk ios-vision

我正在开发一个应用程序,该应用程序使用DJI Mavic 2的视频提要并通过机器学习模型运行它来识别对象。

我设法使用此sample DJI project来让我的应用预览无人机的提要,但是尝试将视频数据转换为{{3}可以使用的格式时遇到了很多麻烦}。

我使用Vision framework作为创建模型的指南(正在运行!),但是看来我需要创建一个VNImageRequestHandler对象,该对象是使用{类型的cvPixelBuffer创建的{1}}才能使用CMSampleBuffer

有人知道如何进行这种转换吗?有更好的方法吗?

Vision

编辑:根据我从DJI(伪造)文档中收集的信息,看来视频供稿是压缩的H264。他们声称class DJICameraViewController: UIViewController, DJIVideoFeedListener, DJISDKManagerDelegate, DJICameraDelegate, VideoFrameProcessor { // ... func videoFeed(_ videoFeed: DJIVideoFeed, didUpdateVideoData rawData: Data) { let videoData = rawData as NSData let videoBuffer = UnsafeMutablePointer<UInt8>.allocate(capacity: videoData.length) videoData.getBytes(videoBuffer, length: videoData.length) DJIVideoPreviewer.instance().push(videoBuffer, length: Int32(videoData.length)) } // MARK: VideoFrameProcessor Protocol Implementation func videoProcessorEnabled() -> Bool { // This is never called return true } func videoProcessFrame(_ frame: UnsafeMutablePointer<VideoFrameYUV>!) { // This is never called let pixelBuffer = frame.pointee.cv_pixelbuffer_fastupload as! CVPixelBuffer let imageRequestHandler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: exifOrientationFromDeviceOrientation(), options: [:]) do { try imageRequestHandler.perform(self.requests) } catch { print(error) } } } // End of DJICameraViewController class 包括用于解压缩的辅助方法,但是由于没有有关其用法的文档,我未能成功理解如何正确使用它们。

编辑2 :这是DJIWidget框架的this example from Apple

编辑3 :使用DJIWidget的其他方法更新了代码段,从VideoFrameProcessor方法中删除了旧代码

编辑4 :有关如何成功提取和使用像素缓冲区的详细信息,请参见issue I created on GitHub

1 个答案:

答案 0 :(得分:3)

步骤:

  1. 调用DJIVideoPreviewer的{​​{1}}方法并输入push:length:。在rawData内部,如果您使用过DJIVideoPreviewer,请跳过此步骤。 (一旦执行此操作,将执行H.264解析和解码步骤。)

  2. 符合VideoPreviewerSDKAdapter协议并调用VideoFrameProcessor以注册DJIVideoPreviewer.registFrameProcessor协议对象。

  3. VideoFrameProcessor协议的VideoFrameProcessor方法将输出videoProcessFrame:数据。

  4. 获取VideoFrameYUV数据。 CVPixelBuffer结构具有一个VideoFrameYUV字段,当打开硬件解码时,此数据实际上是cv_pixelbuffer_fastupload类型的数据。如果您使用软件解码,则需要自己创建CVPixelBuffer并复制CVPixelBuffer的{​​{1}},VideoFrameYUVluma字段中的数据


代码:

chromaB