Я использую фреймворк 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)
}
}
}
}