Обнаружить объект при нажатии жеста - PullRequest
0 голосов
/ 18 сентября 2018

Я работал над проектом, использующим swift, который позволяет пользователю обнаруживать объект, на который смотрит камера, когда он или она касается экрана. Я следовал этому руководству, чтобы понять интеграцию процесса машинного обучения для Ios. Это позволяет камере выскакивать на экране и описание внизу, которое говорит, что это может быть за элемент. Теперь я хочу использовать жест касания, чтобы получить метку объекта только при касании экрана.

Я попытался сделать это в следующем коде. Я немного не уверен, где

 @objc func doubleTapped() { 
 //code
 }

идет в коде. Я пробовал это:

 import UIKit
 import AVKit
 import Vision

class ViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate {

let identifierLabel: UILabel = {
    let label = UILabel()
    label.backgroundColor = .white
    label.textAlignment = .center
    label.translatesAutoresizingMaskIntoConstraints = false
    return label
}()

override func viewDidLoad() {
    super.viewDidLoad()

    let captureSession = AVCaptureSession()
    captureSession.sessionPreset = .photo
    let tap = UITapGestureRecognizer(target: self, action: #selector(doubleTapped))
    tap.numberOfTapsRequired = 1
    view.addGestureRecognizer(tap)
    guard let captureDevice = AVCaptureDevice.default(for: .video) else { return }
    guard let input = try? AVCaptureDeviceInput(device: captureDevice) 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: "videoQueue"))
    captureSession.addOutput(dataOutput)


    //        VNImageRequestHandler(cgImage: <#T##CGImage#>, options: [:]).perform(<#T##requests: [VNRequest]##[VNRequest]#>)

    setupIdentifierConfidenceLabel()
}


fileprivate func setupIdentifierConfidenceLabel() {
    view.addSubview(identifierLabel)
    identifierLabel.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -32).isActive = true
    identifierLabel.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
    identifierLabel.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
    identifierLabel.heightAnchor.constraint(equalToConstant: 50).isActive = true
}

@objc func doubleTapped() {
    print("hello")


func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    //        print("Camera was able to capture a frame:", Date())

    guard let pixelBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }

    // !!!Important
    // make sure to go download the models at https://developer.apple.com/machine-learning/ scroll to the bottom
    guard let model = try? VNCoreMLModel(for: Resnet50().model) else { return }
    let request = VNCoreMLRequest(model: model) { (finishedReq, err) in


        guard let results = finishedReq.results as? [VNClassificationObservation] else { return }

        guard let firstObservation = results.first else { return }

        print(firstObservation.identifier, firstObservation.confidence)

        DispatchQueue.main.async {
            self.identifierLabel.text = "\(firstObservation.identifier) \(firstObservation.confidence * 100)"
        }

    }

    try? VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:]).perform([request])
}
}
}

Когда я не размещаю жест касания, метка изменяется по мере изменения объекта, с которым сталкивается камера. Когда я добавляю жест касания и его функцию, код прерывается.

Я действительно ценю помощь.

...