Я пытаюсь обнаружить прямоугольники со зрением и быстротой.
Я пропустил код, но обнаружил, что следующий оператор печати показывает до завершения функции запроса прямоугольников, что вызывает проблемы в том, что япытается обработать прямоугольник, которого еще нет.
Могу ли я написать завершение, позволяющее первому обнаружению прямоугольника завершиться, прежде чем оно продвинется вперед?
func getRectArray(completion: @escaping (_ finished: Bool) -> ()) {
let imageRequestHandler = VNImageRequestHandler(cgImage: tempFICG!, orientation: CGImagePropertyOrientation(rawValue: 0)!, options: requestOptions)
do {
print("Tony got to check rect part")
try imageRequestHandler.perform([self.rectanglesRequest])
print("Tony got part after rect request")
} catch {
print(error)
}
// These print statements show before the print statements at the end of the rect detect.
print("Tony Finished checking crops and text")
print("Tony recCrop amount is is \(recCrops.count)")
// I want to add a completion here that completes the function this is in but it completes too early
completion(true)
}
}
вызов для обнаружения прямоугольников.
lazy var rectanglesRequest: VNDetectRectanglesRequest = { [unowned self] in
print("Tony 2 Requested....")
return VNDetectRectanglesRequest(completionHandler: self.handleRectangles)
}()
И функция .. func handleRectangles (запрос: VNRequest, ошибка: ошибка?) {
guard let observations = request.results as? [VNRectangleObservation]
else { return }
guard let detectedRectangle = observations.first else {
print("Tony Text Detecting 2")
return
}
noRect = false
print("Tony: Handle rectangles the second time")
let imageSize = changedImage.extent.size
let boundingBox = detectedRectangle.boundingBox.scaled(to: imageSize)
guard changedImage.extent.contains(boundingBox)
else {
noRect = true
print("invalid detected rectangle"); return }
print("Tony Rectangle confidence is: \(detectedRectangle.confidence)")
conf = "\(detectedRectangle.confidence)"
let topLeft = detectedRectangle.topLeft.scaled(to: imageSize)
let topRight = detectedRectangle.topRight.scaled(to: imageSize)
let bottomLeft = detectedRectangle.bottomLeft.scaled(to: imageSize)
let bottomRight = detectedRectangle.bottomRight.scaled(to: imageSize)
let newBoundingBox = boundingBox.insetBy(dx: imageSize.width * -0.2, dy: imageSize.height * -0.2)
print("Tony Rect size is: \(Int(newBoundingBox.width))")
let correctedImage = changedImage
.cropped(to: newBoundingBox)
.applyingFilter("CIPerspectiveCorrection", parameters: [
"inputTopLeft": CIVector(cgPoint: topLeft),
"inputTopRight": CIVector(cgPoint: topRight),
"inputBottomLeft": CIVector(cgPoint: bottomLeft),
"inputBottomRight": CIVector(cgPoint: bottomRight)
])
inputImage = correctedImage
DispatchQueue.main.async {
if self.conf == nil {
self.conf = "none"
self.XMergeNumberLabel.text = ("XM: \(self.swiftPage.xMergeRadius) - Conf: \(self.conf!)")
let cgImage = self.context.createCGImage(inputImage, from: inputImage.extent)
self.finalImageView.image = UIImage(cgImage: cgImage!)
if self.finalImageView.image != nil {
self.finalImage = self.finalImageView.image
recCrops.append(self.finalImage)
print("Tony got to end or rects going to return")
print("Tony recCrop second amount is \(recCrops.count)")
}else {
return
}
}
}
А вот и вывод.Как вы можете видеть, «Тони добирается до конца или возвращается, чтобы вернуться», следует после «Тони закончил проверять посевы и текст», чего не должно быть, потому что нет никакого прямоугольника для обработки, как вы видите в выводе.
Тони должен проверить прямоугольную часть
Tony 2 Requested ....
Tony: второй раз обрабатывать прямоугольники
Tony Rectangle достоверность: 1,0
Размер Тони Ректа: 1413
Тони получил часть после прямого запроса
Тони Закончил проверку посева и текста
Тони recCrop составляет 0
Тони добрался до конца или откажется, собирается вернуться
Тони recCrop вторая сумма составляет 1