我正在开发一个应用程序,它使用来自 DJI Mavic 2 的视频源并通过机器学习模型运行它来识别对象。
我设法让我的应用程序使用这个示例 DJI 项目预览来自无人机的提要,但是我在尝试将视频数据转换为Vision
框架可用的格式时遇到了很多麻烦。
我使用Apple 的这个示例作为创建我的模型的指南(它正在工作!)但看起来我需要创建一个使用类型创建的VNImageRequestHandler
对象才能使用.cvPixelBuffer
CMSampleBuffer
Vision
知道如何进行这种转换吗?有一个更好的方法吗?
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
编辑:根据我从 DJI 的(参差不齐的)文档中收集到的信息,看起来视频源是 H264 压缩的。他们声称DJIWidget
包含用于解压的辅助方法,但我没有成功理解如何正确使用它们,因为没有关于它使用的文档。
编辑 2:这是我在 GitHub 上为 DJIWidget 框架创建的问题
编辑 3:使用附加方法更新代码片段,从方法中VideoFrameProcessor
删除旧代码videoFeed
编辑 4:有关如何成功提取像素缓冲区并利用它的详细信息,请参阅GitHub 的此评论