问题描述
我是SwiftUI的新手,我正在尝试构建一个使用Resnet50模型识别对象并显示其识别名称的应用程序,我能够运行avcapturesession并在控制台中打印对象名称,但在以下情况下我看不到TextView应用正在运行,它始终以全屏方式显示摄像机
这是我的内容视图
import SwiftUI
import AVKit
import Vision
struct ContentView: View {
@ObservedObject var cameraInfo = CameraViewController()
var body: some View {
VStack {
CameraView()
Text(cameraInfo.objectIdentifier)
}
.edgesIgnoringSafeArea(.top)
}
}
这是我的CameraView,它是UIViewControllerRepresentable
struct CameraView: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> CameraViewController {
return CameraViewController()
}
func updateUIViewController(_ uiViewController: CameraViewController,context: Context) {
print("Update Called")
}
typealias UIViewControllerType = CameraViewController
}
这是CameraViewController
final class CameraViewController: UIViewController,ObservableObject,AVCaptureVideoDataOutputSampleBufferDelegate {
var captureSession: AVCaptureSession!
@Published var objectIdentifier: String = ""
func captureOutput(_ output: AVCaptureOutput,didOutput sampleBuffer: CMSampleBuffer,from connection: AVCaptureConnection) {
guard let pixelBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }
guard let model = try? VNCoreMLModel(for: Resnet50().model) else { return }
let request = VNCoreMLRequest(model: model) { (finishedRequest,error) in
guard let results = finishedRequest.results as? [VNClassificationObservation] else { return }
guard let firstObservation = results.first else { return }
self.objectIdentifier = firstObservation.identifier
print("DEBUG: firstObs identifier\(firstObservation.identifier),confidence\(firstObservation.confidence)")
}
try? VNImageRequestHandler(cvPixelBuffer: pixelBuffer,options: [:]).perform([request])
}
override func viewDidLoad() {
super.viewDidLoad()
captureSession = AVCaptureSession()
captureSession.sessionPreset = .photo
guard let videoCaptureDevice = AVCaptureDevice.default(for: .video) else { return }
guard let input = try? AVCaptureDeviceInput(device: videoCaptureDevice) else {return}
captureSession.addInput(input)
captureSession.startRunning()
let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
view.layer.addSublayer(previewLayer)
previewLayer.frame = view.frame
let dataOutput = AVCaptureVideoDataOutput()
dataOutput.setSampleBufferDelegate(self,queue: DispatchQueue(label: "video"))
captureSession.addOutput(dataOutput)
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)