如何在AVCaptureSession上添加视图?就像我正在运行avcapturesession一样,但是无法在其下添加TextView

问题描述

我是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 (将#修改为@)