Показывать прямоугольник вокруг слова, найденного с помощью VNRecognizedTextObservation - PullRequest
0 голосов
/ 04 августа 2020

Я использую фреймворк Vision для обнаружения слова «variedade» на прямой камере. Мне удалось это сделать, но теперь я пытаюсь добавить рамку вокруг слова, но я только понял, как распечатать координаты boundingBox.

Я использовал VNRecognizeTextRequest, чтобы определить текст, который я ищу , и когда я распечатываю ограничивающую рамку, я получаю (0.05774908842042435, 0.23735657526849163, 0.011545353157575738, 0.049361670048045814). Я не уверен, что представляют собой эти значения, поэтому понятия не имею, как их использовать.

Есть какие-нибудь предложения по отображению прямоугольника вокруг слова «variedade»?

import UIKit
import AVFoundation
import Vision

class ViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate {
    
    @IBOutlet weak var cameraView: UIImageView!
    
    //start the camera
    var session = AVCaptureSession()
    
    //make a vision request
    var request: VNRecognizeTextRequest!
    
    override func viewDidLoad() {
        
        //set up vision request before letting ViewController set up the camera so that it exists when the first buffer is received.
        request = VNRecognizeTextRequest(completionHandler: recognizeTextHandler)

        super.viewDidLoad()
    }
    
    override func viewWillAppear(_ animated: Bool) {
        
        //start our live video
        startLiveVideo()
        
    }
    
    //connect our live stream
    func startLiveVideo() {
        
        guard let captureDevice = AVCaptureDevice.default(for: .video) else { return }
        guard let deviceInput = try? AVCaptureDeviceInput(device: captureDevice) else { return }
        
        //add the input
        session.addInput(deviceInput)
        
        //add a sublayer containing the video to the cameraView outlet
        let imageLayer = AVCaptureVideoPreviewLayer(session: session)
        imageLayer.frame = cameraView.bounds
        cameraView.layer.addSublayer(imageLayer)
        
        //monitor camera data output to pass each frame layers to vision handler
        let cameraOutput = AVCaptureVideoDataOutput()
        cameraOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: "videoQueue"))
        session.addOutput(cameraOutput)
        
        //start it all
        session.startRunning()

    }
    
    // vision recognition handler
    func recognizeTextHandler(request: VNRequest, error: Error?) {
        
        guard let results = request.results as? [VNRecognizedTextObservation] else { return }
        
        for visionResult in results {
            let maxCandidates = 5
            guard let candidate = visionResult.topCandidates(maxCandidates).first else {
                continue
            }
            //print(candidate.string)
            print(visionResult.boundingBox)
            if candidate.string == "variedade" {
                print("found")
                print(candidate.boundingBox)
            }
        }
    }
    
    
    //add a delegate method everytime the camera captures a frame
    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
        //print("frame was captured at:", Date())
        
        if let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) {
            
            // Configure for running in real-time.
            request.recognitionLevel = .accurate
            
            // makes recognition slower.
            request.usesLanguageCorrection = false
            
            let requestHandler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:])
            do {
                try requestHandler.perform([request])
            } catch {
                print(error)
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...