Завершение по запросу прямоугольника, iOS, Swift - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь обнаружить прямоугольники со зрением и быстротой.

Я пропустил код, но обнаружил, что следующий оператор печати показывает до завершения функции запроса прямоугольников, что вызывает проблемы в том, что япытается обработать прямоугольник, которого еще нет.

Могу ли я написать завершение, позволяющее первому обнаружению прямоугольника завершиться, прежде чем оно продвинется вперед?

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

1 Ответ

0 голосов
/ 14 сентября 2018

Мне удалось это исправить, удалив DispachQueue.main.казалось, что он вышел рано, когда я зашел в главную ветку, чтобы показать картинку.

...